Как организовать сохранение преобразованной триады символов и вывести полученное значение на экран? - 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 в восьмеричной системе счисления.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д