Как организовать сохранение преобразованной триады символов и вывести полученное значение на экран? - 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
Объяснение кода листинга программы
- Переменная
KeyBufиспользуется для хранения введенного пользователем числа и его преобразования в разные системы счисления. В ней содержится строка, состоящая из трех частей: максимальное значение (7), длина строки (0) и сама строка (7 повторяющихся нулей). Также в ней содержится строка, представляющая символ CR (0Dh) и символ LF (0Ah). - Переменная
CR_LFсодержит строку, состоящую из символов CR (0Dh), LF (0Ah) и символа '$'. - Переменная
Promptсодержит строку, состоящую из текстаВведите число (-32768..+32767):и символа '$'. - Переменная
Res10содержит строку, состоящую из текстаВведено число (десятичное):и символа '$'. - Переменная
Res08содержит строку, состоящую из текстаВведено число (восьмеричное):и символа '$'. - Переменная
Error01содержит строку, состоящую из текстаОшибка ввода числаи символов CR (0Dh) и LF (0Ah), а также символ '$'. - Переменная
ExitMsgсодержит строку, состоящую из текстаДля завершения нажмите Escи символа '$'. - Переменная
Numerсодержит десятичное число, равное -123. - Процедура
Show_axиспользуется для вывода числа, хранящегося в регистре AX, на экран. Входные данные: cx - система счисления (не больше 10), ax - число для отображения. Выходные данные: none. - Процедура
Mainявляется точкой входа в программу. Она содержит код, выполняющий следующие действия:- Переменная
axустанавливается равной сегменту данных. - Переменная
dsустанавливается равной сегменту данных. - Переменная
esустанавливается равной сегменту данных. - Выводится сообщение
Введите число (-32768..+32767) в десятичной системе счисления. - Выводится сообщение
Введите число (-32768..+32767) в восьмеричной системе счисления. - Ожидается нажатие клавиши Esc для завершения программы.
- Переменная
- В сегментный регистр
dsустанавливается сегмент данных, равныйax. - В сегментный регистр
esустанавливается сегмент данных, равныйax. - Код в блоке
@@NoErrorвыполняется при отсутствии ошибок ввода числа. Он выводит введенное число в десятичной системе счисления. - Код в блоке
@@Exitвыполняется перед завершением программы. Он выводит сообщениеДля завершения нажмите Esc. - Код в блоке
@@WaitForEscвыполняется до тех пор, пока не будет нажата клавиша Esc. Он ожидает нажатия любой клавиши и проверяет, является ли нажатая клавиша клавишей Esc. Если это не так, то цикл повторяется. - В конце программы выполняется команда
int 21h, которая завершает выполнение программы. - В сегментный регистр
axзагружается значение регистраNumer. - В переменной
cxустанавливается значение 10, соответствующее десятичной системе счисления. - Вызывается процедура
Show_axдля отображения числа в регистре AX в десятичной системе счисления. - В переменной
cxустанавливается значение 8, соответствующее восьмеричной системе счисления. - Вызывается процедура
Show_axдля отображения числа в регистре AX в восьмеричной системе счисления.