Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ перевод из 10ричной системы

Автор: Глюк 16.04.2008 20:02

программка переводит из 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 17.04.2008 0:12

Программа работает правильно: она выводит 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

Автор: Глюк 17.04.2008 0:56

спасибо,очень благодарен good.gif

Автор: Глюк 17.04.2008 19:15

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

Автор: xds 19.04.2008 21:21

Цитата(Глюк @ 17.04.2008 23:15) *

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

Автор: Глюк 20.04.2008 16:33

вот вывод...

Добавлено через 15 мин.
код такой...из программки вылетает не сразу...еще что-т выводит - не знаю что...но после одного нажатия точно не выходит...ни разу такого не было


Прикрепленные файлы
Прикрепленный файл  STRINGS.rar ( 249 байт ) Кол-во скачиваний: 294

Автор: Глюк 25.04.2008 20:22

ну так как? unsure.gif

Автор: xds 26.04.2008 11:15

Убери опцию /t из вызова tlink.