Программа не выводит ответ - Assembler
Формулировка задачи:
Два двухбайтных беззнаковых кода вводятся с клавиатуры в hex-виде. Определить их числовую сумму и показать на экране в десятичном виде.
Я, к примеру, ввожу в kod1: 1а1а. В kod2 я ввожу b2b2. По идее при сумме я должен получить cccc При переводе в десятичный мне должно выдавать 1201332 Не могу понять где находится ошибка, почему не выводится на экран. Возможно я что-то не дописал или написал не правильно, подскажите\поправьте меня.386 dseg segment use16 text1 db 13,10,'Type HEX: $' text2 db 13,10,'Result..: $' kod1 dw 5,0,5 dup(?) kod2 dw 5,0,5 dup(?) dseg ends cseg segment use16 assume cs:cseg,ds:dseg m1: mov cx,dseg mov ds,cx mov ah, 9 ; выводим строку 'Type HEX: $' lea dx,text1 int 21h mov ah, 0ah ; вводим строку символов lea dx, kod1 int 21h lea di,ds:[kod1+2] xor ch,ch mov cl,byte ptr ds:[kod1+1] xor ax,ax call Pr mov ah, 9 ; выводим строку 'Type HEX: $' lea dx,text1 int 21h mov ah, 0ah ; вводим строку символов lea dx, kod2 int 21h lea di,ds:[kod2+2] xor ch,ch mov cl,byte ptr ds:[kod2+1] xor ax,ax call Pr m3: add dx, cx ; получаем сумму чисел call WRITE_DECIMAL ; получает нужное число в десятичном формате mov ah, 9 ; выводим строку 'Result..: $' lea dx,text2 int 21h mov ax, 4Ch int 21h Pr proc call WRITE_HEX mov dl, dh call WRITE_HEX mov cx, dx ; сохраняю dx в сх ret Pr endp WRITE_HEX proc push cx push dx mov dh, dl shr dl, 4 call WRITE_HEX_DIGIT mov dl, dh and dl, 0Fh call WRITE_HEX_DIGIT pop dx pop cx ret WRITE_HEX endp WRITE_HEX_DIGIT proc push dx cmp dl, 0Ah jae short HEX_LETTER add dl, 30h jmp short WRITE_DIGIT HEX_LETTER: add dl, 37h WRITE_DIGIT: call WRITE_CHAR pop dx ret WRITE_HEX_DIGIT endp WRITE_CHAR proc push ax push bx push cx xor bh, bh mov bl, ds:[di] ; может быть вместо bl должен быть bx mov cx, 1 mov al, dl pop cx pop bx pop ax ret WRITE_CHAR endp WRITE_DECIMAL proc push ax push cx push bx push dx mov ax, dx mov bx, 10d xor cx, cx non_zero: xor dx, dx div bx push dx inc cx cmp ax, 0 jne non_zero write_digit_loop: pop dx call write_hex_digit loop write_digit_loop pop bx pop dx pop cx pop ax ret WRITE_DECIMAL endp cseg ends end m1
Решение задачи: «Программа не выводит ответ»
org 100h jmp start txt1 db 13,10,'Type HEX: $' txt2 db 13,10,'Result..: $' start: mov si,2 @@: mov ah,9 mov dx,txt1 int 21h call asc2hex push cx dec si jnz @b mov ah,9 mov dx,txt2 int 21h pop ax bx add ax,bx call hex2asc exit: xor ax,ax int 16h int 20h ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн ;//=================== ПРОЦЕДУРА ВВОДА НЕХ ===================================| asc2hex: xor cx,cx ; копить число будем в CX @0: mov ah,1 ; ввод с эхом средствами DOS int 21h cmp al,13 ; это ENTER ?! je stop ; да - выходим из цикла ввода sub al,30h ; нет - переводим символ в цифру cmp al,9 ; это цифра 9 ?! jbe @2 ; если ниже/равно, то не трогаем её sub al,11h ; значит HEX-буква. Отнимаем от неё фактор cmp al,5 ; если заглавная буква, то остаток будет jbe @1 ; ^^ ..в пределах(5). Ниже/равно - коррекция! sub al,20h ; значит прописная буква. Коррекция.. @1: add al,10 ; коррекция букв "A..F", в "11..15" @2: shl cx,4 ; сдвигаем мл.тетраду(CL), в старшую or cl,al ; в мл.тетраду(CL) запишем наше число jmp @0 ; читаем следующий символ.. stop: ; юзверь нажал ENTER! Результат у нас в CX. ret ;//==================== ПРОЦЕДУРА ВЫВОДА В DEC ================================| hex2asc: ; Функция переводит числа в символы pusha ; Вход: АХ = число, BX = система счисления mov bx,10 ; Выход: на экране xor cx,cx ; isDiv: ; xor dx,dx ; div bx ; push dx ; inc cx ; or ax,ax ; jnz isDiv ; isOut: ; pop ax ; add al,30h ; int 29h ; loop isOut ; popa ; ret ;
Объяснение кода листинга программы
org 100h jmp start txt1 db 13,10,'Type HEX: $' txt2 db 13,10,'Result..: $' start: mov si,2 @@: mov ah,9 mov dx,txt1 int 21h call asc2hex push cx dec si jnz @b mov ah,9 mov dx,txt2 int 21h pop ax bx add ax,bx call hex2asc exit: xor ax,ax int 16h int 20h ;//=================== ПРОЦЕДУРА ВВОДА НЕХ ===================================| asc2hex: xor cx,cx @0: mov ah,1 int 21h cmp al,13 je stop sub al,30h cmp al,9 jbe @2 sub al,11h cmp al,5 jbe @1 sub al,20h @1: add al,10 @2: shl cx,4 or cl,al jmp @0 stop: ret ;//==================== ПРОЦЕДУРА ВЫВОДА В DEC ================================| hex2asc: pusha ax, bx xor cx,cx isDiv: xor dx,dx div bx push dx inc cx or ax,ax jnz isDiv isOut: pop ax add al,30h int 29h loop isOut popa ret
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д