Программа не выводит ответ - Assembler

Узнай цену своей работы

Формулировка задачи:

Задание для программы такое:

Два двухбайтных беззнаковых кода вводятся с клавиатуры в hex-виде. Определить их числовую сумму и показать на экране в десятичном виде.

Я, к примеру, ввожу в kod1: 1а1а. В kod2 я ввожу b2b2. По идее при сумме я должен получить cccc При переводе в десятичный мне должно выдавать 1201332 Не могу понять где находится ошибка, почему не выводится на экран. Возможно я что-то не дописал или написал не правильно, подскажите\поправьте меня
Листинг программы
  1. .386
  2. dseg segment use16
  3. text1 db 13,10,'Type HEX: $'
  4. text2 db 13,10,'Result..: $'
  5. kod1 dw 5,0,5 dup(?)
  6. kod2 dw 5,0,5 dup(?)
  7. dseg ends
  8. cseg segment use16
  9. assume cs:cseg,ds:dseg
  10. m1:
  11. mov cx,dseg
  12. mov ds,cx
  13. mov ah, 9 ; выводим строку 'Type HEX: $'
  14. lea dx,text1
  15. int 21h
  16. mov ah, 0ah ; вводим строку символов
  17. lea dx, kod1
  18. int 21h
  19. lea di,ds:[kod1+2]
  20. xor ch,ch
  21. mov cl,byte ptr ds:[kod1+1]
  22. xor ax,ax
  23. call Pr
  24.  
  25. mov ah, 9 ; выводим строку 'Type HEX: $'
  26. lea dx,text1
  27. int 21h
  28. mov ah, 0ah ; вводим строку символов
  29. lea dx, kod2
  30. int 21h
  31. lea di,ds:[kod2+2]
  32. xor ch,ch
  33. mov cl,byte ptr ds:[kod2+1]
  34. xor ax,ax
  35.  
  36. call Pr
  37. m3: add dx, cx ; получаем сумму чисел
  38. call WRITE_DECIMAL ; получает нужное число в десятичном формате
  39. mov ah, 9 ; выводим строку 'Result..: $'
  40. lea dx,text2
  41. int 21h
  42.  
  43. mov ax, 4Ch
  44. int 21h
  45.  
  46. Pr proc
  47. call WRITE_HEX
  48. mov dl, dh
  49. call WRITE_HEX
  50. mov cx, dx ; сохраняю dx в сх
  51. ret
  52. Pr endp
  53. WRITE_HEX proc
  54. push cx
  55. push dx
  56. mov dh, dl
  57. shr dl, 4
  58. call WRITE_HEX_DIGIT
  59. mov dl, dh
  60. and dl, 0Fh
  61. call WRITE_HEX_DIGIT
  62. pop dx
  63. pop cx
  64. ret
  65. WRITE_HEX endp
  66. WRITE_HEX_DIGIT proc
  67. push dx
  68. cmp dl, 0Ah
  69. jae short HEX_LETTER
  70. add dl, 30h
  71. jmp short WRITE_DIGIT
  72. HEX_LETTER:
  73. add dl, 37h
  74. WRITE_DIGIT:
  75. call WRITE_CHAR
  76. pop dx
  77. ret
  78. WRITE_HEX_DIGIT endp
  79. WRITE_CHAR proc
  80. push ax
  81. push bx
  82. push cx
  83. xor bh, bh
  84. mov bl, ds:[di] ; может быть вместо bl должен быть bx
  85. mov cx, 1
  86. mov al, dl
  87. pop cx
  88. pop bx
  89. pop ax
  90. ret
  91. WRITE_CHAR endp
  92. WRITE_DECIMAL proc
  93. push ax
  94. push cx
  95. push bx
  96. push dx
  97. mov ax, dx
  98. mov bx, 10d
  99. xor cx, cx
  100. non_zero:
  101. xor dx, dx
  102. div bx
  103. push dx
  104. inc cx
  105. cmp ax, 0
  106. jne non_zero
  107. write_digit_loop:
  108. pop dx
  109. call write_hex_digit
  110. loop write_digit_loop
  111. pop bx
  112. pop dx
  113. pop cx
  114. pop ax
  115. ret
  116. WRITE_DECIMAL endp
  117. cseg ends
  118. end m1

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

textual
Листинг программы
  1. org  100h
  2. jmp  start
  3.  
  4. txt1  db  13,10,'Type HEX: $'
  5. txt2  db  13,10,'Result..: $'
  6.  
  7. start:
  8.      mov   si,2
  9. @@:  mov   ah,9
  10.      mov   dx,txt1
  11.      int   21h
  12.      call  asc2hex
  13.      push  cx
  14.      dec   si
  15.      jnz   @b
  16.  
  17.      mov   ah,9
  18.      mov   dx,txt2
  19.      int   21h
  20.  
  21.      pop   ax bx
  22.      add   ax,bx
  23.      call  hex2asc
  24.  
  25. exit:
  26.      xor   ax,ax
  27.      int   16h
  28.      int   20h
  29.  
  30. ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  31. ;//=================== ПРОЦЕДУРА ВВОДА НЕХ ===================================|
  32. asc2hex:
  33.    xor    cx,cx              ; копить число будем в CX
  34. @0:
  35.    mov    ah,1               ; ввод с эхом средствами DOS
  36.    int    21h
  37.    cmp    al,13              ; это ENTER ?!
  38.    je     stop               ; да - выходим из цикла ввода
  39.    sub    al,30h             ; нет - переводим символ в цифру
  40.    cmp    al,9               ; это цифра 9 ?!
  41.    jbe    @2                 ; если ниже/равно, то не трогаем её
  42.    sub    al,11h             ; значит HEX-буква. Отнимаем от неё фактор
  43.    cmp    al,5               ; если заглавная буква, то остаток будет
  44.    jbe    @1                 ; ^^ ..в пределах(5). Ниже/равно - коррекция!
  45.    sub    al,20h             ; значит прописная буква. Коррекция..
  46. @1:
  47.    add    al,10              ; коррекция букв "A..F", в "11..15"
  48. @2:
  49.    shl    cx,4               ; сдвигаем мл.тетраду(CL), в старшую
  50.    or     cl,al              ; в мл.тетраду(CL) запишем наше число
  51.    jmp    @0                 ; читаем следующий символ..
  52. stop:                        ; юзверь нажал ENTER! Результат у нас в CX.
  53. ret
  54.  
  55. ;//==================== ПРОЦЕДУРА ВЫВОДА В DEC ================================|
  56. hex2asc:                 ; Функция переводит числа в символы
  57.    pusha                 ; Вход:  АХ = число, BX = система счисления
  58.    mov   bx,10           ; Выход: на экране
  59.    xor   cx,cx           ;
  60. isDiv:                   ;
  61.    xor   dx,dx           ;
  62.    div   bx              ;
  63.    push  dx              ;
  64.    inc   cx              ;
  65.    or    ax,ax           ;
  66.    jnz   isDiv           ;
  67. isOut:                   ;
  68.    pop   ax              ;
  69.    add   al,30h          ;
  70.    int   29h             ;
  71.    loop  isOut           ;
  72.    popa                  ;
  73. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут