Программа не выводит ответ - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д