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