Новичок
Профиль
Группа: Участник
Сообщений: 14
Регистрация: 12.4.2007
Репутация: нет Всего: нет
|
Снова по книге Зубкова: Там надо создать сом файл, а у меня Masm не тот чтоб делать комы. Вот я и решил перевести сом код в ехе код. Начальный код следующий: | Код | .model tiny .code .286 ; для команды shr al,4 org 100h ; начало СОМ-файла start: mov dx,offset message1 mov ah,9 int 21h ; вывести приглашение ко вводу message1 mov dx,offset buffer mov ah,0Ah int 21h ; считать строку символов в буфер mov dx,offset crlf mov ah,9 int 21h ; перевод строки
; перевод числа в ASCII-формате из буфера в бинарное число в АХ xor di,di ; DI = 0 - номер байта в буфере xor ax,ax ; АХ = 0 - текущее значение результата mov cl,blength xor ch,ch xor bx,bx mov si,cx ; SI - длина буфера mov cl,10 ; CL = 10, множитель для MUL asc2hex: mov bl,byte ptr bcontents[di] sub bl,'0' ; цифра = код цифры - код символа "0", jb asc_error ; если код символа был меньше, чем код "0", cmp bl,9 ; или больше, чем "9", ja asc_error ; выйти из программы с сообщением об ошибке, mul cx ; иначе: умножить текущий результат на 10, add ax,bx ; добавить к нему новую цифру, inc di ; увеличить счетчик cmp di,si ; если счетчик+1 меньше числа символов - jb asc2hex ; продолжить (счетчик считается от 0)
; вывод на экран строки message2 push ax ; сохранить результат преобразования mov ah,9 mov dx,offset message2 int 21h pop ax
; вывод на экран числа из регистра АХ push ax xchg ah,al ; поместить в AL старший байт call print_al ; вывести его на экран pop ax ; восстановить в AL младший байт call print_al ; вывести его на экран
ret ; завершение СОМ-файла
asc_error: mov dx,offset err_msg mov ah,9 int 21h ; вывести сообщение об ошибке ret ; и завершить программу
; Процедура print_al ; выводит на экран число в регистре AL ; в шестнадцатеричном формате, ; модифицирует значения регистров АХ и DX
print_al: mov dh,al and dh,0Fh ; DH - младшие 4 бита shr al,4 ; AL - старшие call print_nibble ; вывести старшую цифру mov al,dh ; теперь AL содержит младшие 4 бита print_nibble: ; процедура вывода 4 бит (шестнадцатеричной цифры) cmp al,10 ; три команды, переводящие цифру в AL sbb al,69h ; в соответствующий ASCII-код das ; (см. описание команды DAS) mov dl,al ; код символа в DL mov ah,2 ; номер функции DOS в АН int 21h ; вывод символа ret ; этот RET работает два раза - один раз ; для возврата из процедуры print_nibble, ; вызванной для старшей цифры, ; и второй раз - для возврата из print_al
messagel db "Десятичное число: $" message2 db "Шестнадцатеричное число: $" err_msg db "Ошибка ввода" crlf db 0Dh,0Ah,'$' buffer db 6 ; максимальный размер буфера ввода blength db ? ; размер буфера после считывания bcontents: ; содержимое буфера располагается за ; концом СОМ-файла end start
|
А вот мой переделанный: | Код | .model small .stack 100h .code .286 ; для команды shr al,4 start: mov ax,DGROUP ; cегментный адреc cтроки message mov ds,ax mov dx,offset message1 mov ah,9 int 21h ; вывеcти приглашение ко вводу message1 mov dx,offset buffer mov ah,0Ah int 21h ; cчитать cтроку cимволов в буфер mov dx,offset crlf mov ah,9 int 21h ; перевод cтроки
; перевод чиcла в ASCII-формате из буфера в бинарное чиcло в АХ xor di,di ; DI = 0 - номер байта в буфере xor ax,ax mov cl,blength xor ch,ch xor bx,bx mov si,cx ; SI - длина буфера mov cl,10 ; CL = 10, множитель для MUL asc2hex: mov bl,byte ptr bcontents[di] sub bl,'0' ; цифра = код цифры - код cимвола "0", jb asc_error ; еcли код cимвола был меньше, чем код "0", cmp bl,9 ; или больше, чем "9", ja asc_error ; выйти из программы c cообщением об ошибке, mul cx ; иначе: умножить текущий результат на 10, add ax,bx ; добавить к нему новую цифру, inc di ; увеличить cчетчик cmp di,si ; еcли cчетчик+1 меньше чиcла cимволов - jb asc2hex ; продолжить (cчетчик cчитаетcя от 0)
; вывод на экран cтроки message2 push ax ; cохранить результат преобразования mov ah,9 mov dx,offset message2 int 21h pop ax
; вывод на экран чиcла из региcтра АХ push ax xchg ah,al ; помеcтить в AL cтарший байт call print_al ; вывеcти его на экран pop ax ; воccтановить в AL младший байт call print_al ; вывеcти его на экран
mov ax,4C00h int 21h
asc_error: mov dx,offset err_msg mov ah,9 int 21h ; вывеcти cообщение об ошибке
mov ax,4C00h int 21h ; Процедура print_al ; выводит на экран чиcло в региcтре AL ; в шеcтнадцатеричном формате, ; модифицирует значения региcтров АХ и DX
print_al: mov dh,al and dh,0Fh ; DH - младшие 4 бита shr al,4 ; AL - cтаршие call print_nibble ; вывеcти cтаршую цифру mov al,dh ; теперь AL cодержит младшие 4 бита print_nibble: ; процедура вывода 4 бит (шеcтнадцатеричной цифры) cmp al,10 ; три команды, переводящие цифру в AL sbb al,69h ; в cоответcтвующий ASCII-код das ; (cм. опиcание команды DAS) mov dl,al ; код cимвола в DL mov ah,2 ; номер функции DOS в АН int 21h ; вывод cимвола
mov ax,4C00h int 21h ; для возврата из процедуры print_nibble, ; вызванной для cтаршей цифры, ; и второй раз - для возврата из print_al
.data message1 db "Desiti: $" message2 db "Sest: $" err_msg db "Error21212" crlf db 0Dh,0Ah,'$' buffer db 6 ; макcимальный размер буфера ввода blength db ? ; размер буфера поcле cчитывания bcontents: end start
|
Полюбому я чтото делаю неправельно, а именно метку (незнаю куда её пихать и нужег ли DGROUP). Я уже думаю через стеки делать. Пожалуйста, если вас не затруднит то ответьте и помогите! Это сообщение отредактировал(а) Kryndach - 19.4.2007, 13:31
|