Помощь - Поиск - Пользователи - Календарь
Полная версия: перевод из 10ричной системы
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Глюк
программка переводит из 10ричной системы в 16,8,2ичные...кроме ответов на экран выводятся символы какие-то и после вывода не выходит сразу...Где-т ошибка sad.gif((
может кто-нибудь помочь с комментариями к этой программке rolleyes.gif ,т.к. в ассемблере я новичок,понятно,но н все - есть сомнения

.model tiny
.code
org 100h
start:

mov ax,6219
push ax
push ax

mov bx,16
lea si,string
call IntToStr
mov ah,9
lea dx,string
int 21h

pop ax
mov bx,8
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h

pop ax
mov bx,2
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h


mov ah,8
int 21h
ret
Break db 13,10
string db 64 dup('$')

IntToStr proc
;IN:
;ESI = address of the string to output the number
;EAX = nubmer to convert to string
;EBX = scale of notation
;
;OUT:
;number, converted to string at address, passed in ESI
;EBX = 0 if Error

;check scale of notation
cmp bx,9+26;9 digits and 26 letters
jae its_out_of_range

push dx
push di
push cx

its_sgn_plus:
xor cx,cx
mov di,si
its_repeat:
xor dx,dx
div bx
cmp dl,10
jge its_letter
add dl,30h
jmp its_notletter
its_letter:
add dl,41h-10
its_notletter:
mov byte ptr [di],dl
inc cx
inc di
test ax,ax
jne its_repeat

push cx
shr cx,1
jnc $+3
inc cx

its_invert_order:
dec di
mov dl,byte ptr [di]
mov al,byte ptr [si]
mov byte ptr [si],dl
mov byte ptr [di],al
inc si
dec cx ;loop its_invert_order
jnz its_invert_order
pop cx

pop cx
pop di
pop dx
ret

its_out_of_range:
xor bx,bx ;EBX = 0 if Error
ret

IntToStr endp
end start
xds
Программа работает правильно: она выводит 3 строчки - шестнадцатеричное, восьмеричное и двоичное представление десятичного числа 6219, а затем ждет нажатия на любую клавишу (по задумке автора - чтобы можно было рассмотреть результат) и завершается.

Добавлено через 17 мин.
.model tiny
.code
org 100h
start:

mov ax,6219 ;ax = 6219 (число, которое надо перевести)
push ax ;сохраняем две его копии в стек
push ax

;перевод в шестнадцатеричный вид
mov bx,16 ;bx = 16 - основание системы, в которую надо перевести
lea si,string ;si указывает на буфер, в который надо записать строку - результат перевода
call IntToStr ;обращение к процедуре перевода
mov ah,9 ;вывод результата - системный вызов DOS int 21h/ah = 9 - вывод строки
lea dx,string
int 21h

;перевод в восьмеричный вид
pop ax ;ax = 6219 - копия из стека
mov bx,8
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h

;перевод в двоичный вид
pop ax
mov bx,2
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h

;ожидать нажатия любой клавиши
mov ah,8
int 21h

;выход из программы - переход на адрес PSP:0, по которому располагается системный
;вызов DOS int 20h - завершение работы программы
ret

Break db 13,10 ;последовательность символов CR, LF - переход на новую строку

string db 64 dup('$') ;буфер для записи результата перевода

;--- процедура записи числа в виде строки в заданной системе счисления ---
; (процедура откуда-то скопирована автором программы и переделана для 16-разрядного режима ЦП)
IntToStr proc
;Входные данные:
;SI = адрес буфера для вывода строки
;AX = число, которое надо преобразовать в строку
;BX = основание системы счисления
;
;Выходные данные:
;число, преобразованное в строку по адресу, указанному в SI
;BX = 0 в случае ошибки (если основание системы > 35 и десятичных цифр и латиских букв для записи числа недостаточно)

;проверка основания
cmp bx,9+26;9 цифр и 26 букв
jae its_out_of_range

push dx
push di
push cx

its_sgn_plus:
xor cx,cx
mov di,si
its_repeat:
xor dx,dx
div bx
cmp dl,10
jge its_letter
add dl,30h
jmp its_notletter
its_letter:
add dl,41h-10
its_notletter:
mov byte ptr [di],dl
inc cx
inc di
test ax,ax
jne its_repeat

push cx
shr cx,1
jnc $+3
inc cx

its_invert_order:
dec di
mov dl,byte ptr [di]
mov al,byte ptr [si]
mov byte ptr [si],dl
mov byte ptr [di],al
inc si
loop its_invert_order
pop cx

pop cx
pop di
pop dx
ret

its_out_of_range:
xor bx,bx ;EBX = 0 в лучае ошибки
ret

IntToStr endp
end start
Глюк
спасибо,очень благодарен good.gif
Глюк
но все-же...зачем после каждой строки с результатом(после 16рич,8,2...) идет строчки непонятных символов...
и после вывода результата,когда нажимаю на клавишу - не выходит,опять идут строки...и не выходит вообще...=((((
реализовал через tasm
xds
Цитата(Глюк @ 17.04.2008 23:15) *

но все-же...зачем после каждой строки с результатом(после 16рич,8,2...) идет строчки непонятных символов...
и после вывода результата,когда нажимаю на клавишу - не выходит,опять идут строки...и не выходит вообще...=((((
реализовал через tasm
Странно, должно работать ровно (несмотря на то, что с переводом строк там придумка). Код в точности такой? Покажи вывод.
Глюк
вот вывод...

Добавлено через 15 мин.
код такой...из программки вылетает не сразу...еще что-т выводит - не знаю что...но после одного нажатия точно не выходит...ни разу такого не было
Глюк
ну так как? unsure.gif
xds
Убери опцию /t из вызова tlink.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.