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