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

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

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

Имеется след участок по преобразованию в восьмеричную систему
STACKSG SEGMENT PARA STACK 'STACK' 
        DB 64 DUP(?)               
STACKSG ENDS                    

DATASG  SEGMENT PARA 'DATA'      
        STR2 DB ('56') ; исх.число
        STR3 DB (' ')                
DATASG ENDS                     
 
CODESG  SEGMENT PARA 'CODE'        
    ASSUME CS:CODESG, DS:DATASG, SS:STACKSG
    ENTRY   PROC FAR   
        PUSH DS
        SUB AX,AX
        PUSH AX   
        MOV AX,DATASG 
        MOV DS,AX     
  
    LEA di,str2
    MOV CX,2 
 
M1:
    MOV  BL,[DI]   ;переносим 1 символ
    AND bl,00000111b  ;"преобразуем" триаду        
        SAR BL,3   ;след. триада
        INC DI  ;след символ строки
LOOP M1
    
    ret
  ENTRY ENDP
  CODESG ENDS
END ENTRY
Собственно вопрос, как организовать сохранение "преобразованной" триады символов (знаю что с помощью стека,но как ?) и вывести полученное значение на экран?

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

textual
Листинг программы
.MODEL  Small
 
.DATA
 
KeyBuf  db      7, 0, 7 dup(0)      ;max,len,string,CR(0dh)
CR_LF   db      0Dh, 0Ah, '$'
 
Prompt  db      'Введите число (-32768..+32767): ', '$'
Res10   db      'Введено число (десятичное    ): ', '$'
Res08   db      'Введено число (восьмеричное  ): ', '$'
Error01 db      'Ошибка ввода числа',0Dh, 0Ah, '$'
ExitMsg db      'Для завершения нажмите Esc', '$'
 
Numer   dw      -123
 
.CODE
 
; выводит число в регистре AX на экран
; входные данные:
; cx - система счисления (не больше 10)
; ax - число для отображения
Show_ax PROC
;        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@show
        ret
Show_ax ENDP
 
Main    PROC    FAR
        mov     ax, @DATA
        mov     ds, ax
        mov     es, ax
 
@@NoError:
        ; в десятичном представлении
        lea     dx, Res10
        mov     ah,09h
        int     21h
 
        mov     ax, Numer
        mov     cx, 10
        call    Show_ax
 
        lea     dx, CR_LF
        mov     ah,09h
        int     21h
 
        ; в восьмеричном представлении
        lea     dx, Res08
        mov     ah,09h
        int     21h
 
        mov     ax, Numer
        mov     cx, 8
        call    Show_ax
 
        lea     dx, CR_LF
        mov     ah,09h
        int     21h
 
        ; выход
@@Exit:
        lea     dx, ExitMsg
        mov     ah,09h
        int     21h
 
        ; ожидание нажатия клавиши Esc
@@WaitForEsc:
        mov     ah,07h        ; ожидаем нажатие любой клавиши
        int     21h
 
        cmp     al, 1Bh       ; 1Bh - код клавиши Esc
        jnz     @@WaitForEsc  ; если это не Esc, то повторить
 
        mov     ax,4c00h
        int     21h
Main    ENDP
 
.STACK  100h
 
        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
Похожие ответы