Как организовать сохранение преобразованной триады символов и вывести полученное значение на экран? - Assembler

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

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

Имеется след участок по преобразованию в восьмеричную систему
Листинг программы
  1. STACKSG SEGMENT PARA STACK 'STACK'
  2. DB 64 DUP(?)
  3. STACKSG ENDS
  4.  
  5. DATASG SEGMENT PARA 'DATA'
  6. STR2 DB ('56') ; исх.число
  7. STR3 DB (' ')
  8. DATASG ENDS
  9. CODESG SEGMENT PARA 'CODE'
  10. ASSUME CS:CODESG, DS:DATASG, SS:STACKSG
  11. ENTRY PROC FAR
  12. PUSH DS
  13. SUB AX,AX
  14. PUSH AX
  15. MOV AX,DATASG
  16. MOV DS,AX
  17. LEA di,str2
  18. MOV CX,2
  19. M1:
  20. MOV BL,[DI] ;переносим 1 символ
  21. AND bl,00000111b ;"преобразуем" триаду
  22. SAR BL,3 ;след. триада
  23. INC DI ;след символ строки
  24. LOOP M1
  25. ret
  26. ENTRY ENDP
  27. CODESG ENDS
  28. END ENTRY
Собственно вопрос, как организовать сохранение "преобразованной" триады символов (знаю что с помощью стека,но как ?) и вывести полученное значение на экран?

Решение задачи: «Как организовать сохранение преобразованной триады символов и вывести полученное значение на экран?»

textual
Листинг программы
  1. .MODEL  Small
  2.  
  3. .DATA
  4.  
  5. KeyBuf  db      7, 0, 7 dup(0)      ;max,len,string,CR(0dh)
  6. CR_LF   db      0Dh, 0Ah, '$'
  7.  
  8. Prompt  db      'Введите число (-32768..+32767): ', '$'
  9. Res10   db      'Введено число (десятичное    ): ', '$'
  10. Res08   db      'Введено число (восьмеричное  ): ', '$'
  11. Error01 db      'Ошибка ввода числа',0Dh, 0Ah, '$'
  12. ExitMsg db      'Для завершения нажмите Esc', '$'
  13.  
  14. Numer   dw      -123
  15.  
  16. .CODE
  17.  
  18. ; выводит число в регистре AX на экран
  19. ; входные данные:
  20. ; cx - система счисления (не больше 10)
  21. ; ax - число для отображения
  22. Show_ax PROC
  23. ;        mov     cx, 10
  24.         xor     di, di          ; di - кол. цифр в числе
  25.  
  26.         ; если число в ax отрицательное, то
  27.         ;1) напечатать '-'
  28.         ;2) сделать ax положительным
  29.         or      ax, ax
  30.         jns     @@Conv
  31.         push    ax
  32.         mov     dx, '-'
  33.         mov     ah, 2           ; ah - функция вывода символа на экран
  34.         int     21h
  35.         pop     ax
  36.  
  37.         neg     ax
  38.  
  39. @@Conv:
  40.         xor     dx, dx
  41.         div     cx              ; dl = num mod 10
  42.         add     dl, '0'         ; перевод в символьный формат
  43.         inc     di
  44.         push    dx              ; складываем в стэк
  45.         or      ax, ax
  46.         jnz     @@conv
  47.         ; выводим из стэка на экран
  48. @@Show:
  49.         pop     dx              ; dl = очередной символ
  50.         mov     ah, 2           ; ah - функция вывода символа на экран
  51.         int     21h
  52.         dec     di              ; повторяем пока di<>0
  53.         jnz     @@show
  54.         ret
  55. Show_ax ENDP
  56.  
  57. Main    PROC    FAR
  58.         mov     ax, @DATA
  59.         mov     ds, ax
  60.         mov     es, ax
  61.  
  62. @@NoError:
  63.         ; в десятичном представлении
  64.         lea     dx, Res10
  65.         mov     ah,09h
  66.         int     21h
  67.  
  68.         mov     ax, Numer
  69.         mov     cx, 10
  70.         call    Show_ax
  71.  
  72.         lea     dx, CR_LF
  73.         mov     ah,09h
  74.         int     21h
  75.  
  76.         ; в восьмеричном представлении
  77.         lea     dx, Res08
  78.         mov     ah,09h
  79.         int     21h
  80.  
  81.         mov     ax, Numer
  82.         mov     cx, 8
  83.         call    Show_ax
  84.  
  85.         lea     dx, CR_LF
  86.         mov     ah,09h
  87.         int     21h
  88.  
  89.         ; выход
  90. @@Exit:
  91.         lea     dx, ExitMsg
  92.         mov     ah,09h
  93.         int     21h
  94.  
  95.         ; ожидание нажатия клавиши Esc
  96. @@WaitForEsc:
  97.         mov     ah,07h        ; ожидаем нажатие любой клавиши
  98.         int     21h
  99.  
  100.         cmp     al, 1Bh       ; 1Bh - код клавиши Esc
  101.         jnz     @@WaitForEsc  ; если это не Esc, то повторить
  102.  
  103.         mov     ax,4c00h
  104.         int     21h
  105. Main    ENDP
  106.  
  107. .STACK  100h
  108.  
  109.         END     Main

Объяснение кода листинга программы

  1. Переменная KeyBuf используется для хранения введенного пользователем числа и его преобразования в разные системы счисления. В ней содержится строка, состоящая из трех частей: максимальное значение (7), длина строки (0) и сама строка (7 повторяющихся нулей). Также в ней содержится строка, представляющая символ CR (0Dh) и символ LF (0Ah).
  2. Переменная CR_LF содержит строку, состоящую из символов CR (0Dh), LF (0Ah) и символа '$'.
  3. Переменная Prompt содержит строку, состоящую из текста Введите число (-32768..+32767): и символа '$'.
  4. Переменная Res10 содержит строку, состоящую из текста Введено число (десятичное): и символа '$'.
  5. Переменная Res08 содержит строку, состоящую из текста Введено число (восьмеричное): и символа '$'.
  6. Переменная Error01 содержит строку, состоящую из текста Ошибка ввода числа и символов CR (0Dh) и LF (0Ah), а также символ '$'.
  7. Переменная ExitMsg содержит строку, состоящую из текста Для завершения нажмите Esc и символа '$'.
  8. Переменная Numer содержит десятичное число, равное -123.
  9. Процедура Show_ax используется для вывода числа, хранящегося в регистре AX, на экран. Входные данные: cx - система счисления (не больше 10), ax - число для отображения. Выходные данные: none.
  10. Процедура Main является точкой входа в программу. Она содержит код, выполняющий следующие действия:
    • Переменная ax устанавливается равной сегменту данных.
    • Переменная ds устанавливается равной сегменту данных.
    • Переменная es устанавливается равной сегменту данных.
    • Выводится сообщение Введите число (-32768..+32767) в десятичной системе счисления.
    • Выводится сообщение Введите число (-32768..+32767) в восьмеричной системе счисления.
    • Ожидается нажатие клавиши Esc для завершения программы.
  11. В сегментный регистр ds устанавливается сегмент данных, равный ax.
  12. В сегментный регистр es устанавливается сегмент данных, равный ax.
  13. Код в блоке @@NoError выполняется при отсутствии ошибок ввода числа. Он выводит введенное число в десятичной системе счисления.
  14. Код в блоке @@Exit выполняется перед завершением программы. Он выводит сообщение Для завершения нажмите Esc.
  15. Код в блоке @@WaitForEsc выполняется до тех пор, пока не будет нажата клавиша Esc. Он ожидает нажатия любой клавиши и проверяет, является ли нажатая клавиша клавишей Esc. Если это не так, то цикл повторяется.
  16. В конце программы выполняется команда int 21h, которая завершает выполнение программы.
  17. В сегментный регистр ax загружается значение регистра Numer.
  18. В переменной cx устанавливается значение 10, соответствующее десятичной системе счисления.
  19. Вызывается процедура Show_ax для отображения числа в регистре AX в десятичной системе счисления.
  20. В переменной cx устанавливается значение 8, соответствующее восьмеричной системе счисления.
  21. Вызывается процедура Show_ax для отображения числа в регистре AX в восьмеричной системе счисления.

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


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

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

8   голосов , оценка 4 из 5

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

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

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