Вывод последовательности чисел в обратном порядке - Assembler

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

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

Приветствую всех форумчан! Работая над контрольной работой зашел в тупик, поэтому прошу помощи. Задание следующее - ввести с клавы последовательность трехзначных dec чисел разделенных пробелом, программа должна вывести ее на экран в обратном порядке в hex числах. Внизу приведу код, который смог составить.
Листинг программы
  1. [org 100h]
  2. jmp start
  3. mess0 db 13,10,' ВВЕДИТЕ ЧИСЛА В ДЕСЯТИЧНОЙ СИСТЕМЕ (ENTER-ЗАКОНЧИТЬ) $'
  4. mess1 db 13,10,' В ШЕСТНАДЦАТЕРИЧНОЙ СИСТЕМЕ В ОБРАТНОМ ПОРЯДКЕ $'
  5. start:
  6. mov dx,mess0 ; печать текста 'ВВЕДИТЕ ... (ENTER-ЗАКОНЧИТЬ)'
  7. call MESSAGE
  8. xor bp,bp
  9. vvod:
  10. call ASC2HEX ; вызов процедуры, преобразующей ascII код в hex числа
  11. push cx ; в стеке первые 3 числа hex
  12. inc bp ; счетчик стека увеличивается на единицу
  13. mov ah,8 ; ввод ,БЕЗ ЭХА средствами DOS
  14. int 21h ;
  15. cmp al,13 ; это 'enter'?
  16. jne vvod ; если нет, вводим следующее число
  17. mov dx,mess1 ; печать текста 'В ШЕСТНАДЦАТЕРИЧНОЙ СИСТЕМЕ В ОБРАТНОМ ПОРЯДКЕ'
  18. call MESSAGE
  19. vivod:
  20. pop ax ; вытащили из стека последние 3 числа
  21. mov bx,10
  22. v.1: ; переворот числа в ах задом наперед
  23. div bx ; делим ax на 10, в остатке в dx сохраняется последняя цифра
  24. shl dx,4 ; сдвигаем эту цифру влево на один полубайт
  25. or ax,ax ; проверяем, в ах после деления что-нибудь осталось?
  26. jnz v.1 ; если да, цикл повторяется снова
  27. mov ax,dx ; в итоге в dx должно накопится число, обратное ax по порядку
  28. dec bp ; счетчик стека уменьшился на единицу
  29. mov bx,16 ; BX=16
  30. call HEX2ASC ; вызов процедуры преобразования hex в ascII код и их печать
  31. or bp,bp ; счетчик стеков равен нулю?
  32. jnz vivod ; если нет, вытаскиваем предпоследние 3 числа
  33. exit:
  34. xor ax, ax
  35. int 16h
  36. int 20h
  37. ;============== ВЫВОД НА ЭКРАН СРЕДСТВАМИ DOS ================================|
  38. MESSAGE:
  39. mov ah,9 ; строки
  40. int 21h
  41. ret
  42. ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  43. ;============== ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ =====================|
  44. ASC2HEX:
  45. XOR CX,CX
  46. @0: ;
  47. MOV AH,8 ; ввод ,БЕЗ ЭХА средствами DOS
  48. INT 21h ;
  49. CMP AL,20h ; это пробел - выход из цикла
  50. JE stop ;
  51. MOV DL,AL ; скидываем введенное число в DL
  52. CMP AL,30h ; введенное число asc2
  53. JB @0 ; меньше 30? значит в начало
  54. CMP AL,39h ; может больше 39? да - направляем в начало
  55. JA @0 ;
  56. SUB AL,30h ; меньше/равно 39, вычитаем 30h
  57. @2: ;
  58. SHL CX,4 ; сдвигаем мл.полубайт (CL), в старший
  59. OR CL,AL ; в мл.полубайте (CL) запишем наше число
  60. @1:
  61. MOV AH,2 ; печать средствами DOS
  62. INT 21h
  63. JMP @0 ; читаем следующий символ..
  64. stop: ; Если нажал ENTER, то результат у нас в CX.
  65. RET ;
  66. ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  67. ;============== ФУНКЦИЯ ВЫВОДИТ НА ЭКРАН В РАЗЛИЧНЫХ СС =======================|
  68. HEX2ASC: ;
  69. XOR CX,CX ; На входе: BX = система счисления, AX = число
  70. isDiv: ;
  71. XOR DX,DX ; очистим место под остаток
  72. DIV BX ; разделим AX на фактор системы счисления
  73. PUSH DX ; сохраняем остаток от деления
  74. INC CX ; увеличим счётчик разрядности цифры
  75. OR AX,AX ; это последняя цифра?!
  76. JNZ isDiv ; нет - читаем следующую..
  77. isOut: ; <-- в СХ у нас кол-во пуш'ей (для LOOP)
  78. POP AX ; снимаем со-стека остаток в обратном порядке
  79. CMP AL,9 ; проверка на десятичную цифру
  80. JLE noHex ; меньше/равно? значит не HEX-цифра
  81. ADD AL,7 ; иначе: коррекция для HEX
  82. noHex: ;
  83. ADD AL,30h ; переводим цифру в символ
  84. INT 29h ; выводим её на экран
  85. LOOP isOut ; мотаем цикл CX-раз..
  86. RET ;
  87. ;
Код дает ошибки при вводе, затем переполнение при делении. В связи с этим подскажите, пожалуйста, 1. При вводе чисел пробелы не печатаются, пытался исправить, не вышло. 2. После ввода третьего числа и нажатия пробела ввожу следующие 3 числа, печатает только 2 из них, почему, не знаю. 3. С переполнением пытался бороться предварительным обнулением dx, безрезультатно. За любой ответ буду крайне признателен, так как хочется все же разобраться да и без кода сессии мне не видать.

Решение задачи: «Вывод последовательности чисел в обратном порядке»

textual
Листинг программы
  1. org 100h
  2. jmp  start
  3.  
  4. mess0   db  13,10,' ВВЕДИТЕ ЧИСЛА В ДЕСЯТИЧНОЙ СИСТЕМЕ (ENTER-ЗАКОНЧИТЬ) $'  
  5. mess1   db  13,10,' В ШЕСТНАДЦАТЕРИЧНОЙ СИСТЕМЕ В ОБРАТНОМ ПОРЯДКЕ   $'
  6. start:
  7.  mov   dx,mess0 ; печать текста 'ВВЕДИТЕ ... (ENTER-ЗАКОНЧИТЬ)'
  8.    call  MESSAGE
  9.    xor   bp,bp
  10.    mov   bx,10
  11. vvod:
  12.    call  ASC2HEX  ; вызов процедуры, преобразующей ascII код в hex числа
  13.    push  cx   ; в стеке первые 3 числа hex
  14.    inc   bp   ; счетчик стека увеличивается на единицу
  15.    cmp   al,13    ; это 'enter'?
  16.    jne   vvod     ; если нет, вводим следующее число
  17.  
  18.    mov   dx,mess1 ; печать текста 'В ШЕСТНАДЦАТЕРИЧНОЙ СИСТЕМЕ В ОБРАТНОМ ПОРЯДКЕ'
  19.    call  MESSAGE
  20.    mov   bx,16
  21. vivod:   
  22.    pop   ax   ; вытащили из стека последние 3 числа
  23.    call  HEX2ASC  ; вызов процедуры преобразования hex в ascII код и их печать
  24.    dec    bp;,bp    ; счетчик стеков равен нулю?
  25.    jnz   vivod    ; если нет, вытаскиваем предпоследние 3 числа
  26.  
  27.  exit:
  28.    xor   ax, ax
  29.    int   16h
  30.    int   20h
  31.  
  32. ;============== ВЫВОД НА ЭКРАН СРЕДСТВАМИ DOS ================================|
  33. MESSAGE:
  34.    mov   ah,9 ; строки
  35.    int   21h
  36. ret
  37. ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  38. ;============== ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ =====================|
  39. ASC2HEX:
  40.    XOR    CX,CX
  41. @0:       ;
  42.    MOV   AH,8         ; ввод ,БЕЗ ЭХА средствами DOS
  43.    INT   21h          ;
  44.    cmp   al,13
  45.    jz    stop
  46.    mov   dl,al
  47.    CMP   AL,20h       ; это пробел - выход из цикла
  48.    JE    @1
  49.    CMP   AL,30h       ; введенное число asc2
  50.    JB    @0   ; меньше 30? значит в начало
  51.    CMP   AL,39h       ; может больше 39? да - направляем в начало
  52.    JA    @0
  53.    push  dx
  54.    and   ax,0fh
  55.    xchg  cx,ax
  56.    xor   dx,dx
  57.    mul   bx
  58.    add   cx,ax
  59.    pop   dx
  60. @1:
  61.    MOV   AH,2         ; печать средствами DOS
  62.    INT   21h
  63.    cmp   dl,' '        ; читаем следующий символ..
  64.    jnz   @0
  65.  
  66. stop:          ; Если нажал ENTER, то результат у нас в CX.
  67. RET        ;
  68. ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  69. ;============== ФУНКЦИЯ ВЫВОДИТ НА ЭКРАН В РАЗЛИЧНЫХ СС =======================|
  70. HEX2ASC:       ;
  71.    XOR   CX,CX         ; На входе: BX = система счисления, AX = число
  72. isDiv:         ;
  73.    XOR   DX,DX         ; очистим место под остаток
  74.    DIV   BX    ; разделим AX на фактор системы счисления
  75.    PUSH  DX    ; сохраняем остаток от деления
  76.    INC   CX    ; увеличим счётчик разрядности цифры
  77.    OR    AX,AX         ; это последняя цифра?!
  78.    JNZ   isDiv         ; нет - читаем следующую..
  79. isOut:         ; <-- в СХ у нас кол-во пуш'ей (для LOOP)
  80.    POP   AX    ; снимаем со-стека остаток в обратном порядке
  81.    CMP   AL,9          ; проверка на десятичную цифру
  82.    JLE   noHex         ; меньше/равно? значит не HEX-цифра
  83.    ADD   AL,7          ; иначе: коррекция для HEX
  84. noHex:         ;
  85.    ADD   AL,30h        ; переводим цифру в символ
  86.    INT   29h           ; выводим её на экран
  87.    LOOP  isOut         ; мотаем цикл CX-раз..
  88.    mov   al,' '
  89.    int  29h
  90. RET        ;

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


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

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

15   голосов , оценка 4.133 из 5

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

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

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