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

Решение задачи: «Программа не выводит ответ»

textual
Листинг программы
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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5