Пояснить код ассемблера - Assembler
Формулировка задачи:
;Программа~преобразования двузначного шестнадцатеричного числа
;в символьном виде в двоичное представление.
;Вход: исходное шестнадцатеричное число из двух цифр,
;вводится с клавиатуры.
;Выход: результат преобразования помещается в регистр dl.
;
; -----------------------------
data segment para public "data"
message db
data ends
stk segment stack
db 256 dup ("?")
stk ends
code segment para public "code"
main proc
assume cs:code,ds:data,ss:stk
mov ax,data
mov ds,ax ;ax в ds
mov ah,9
mov dx,offset message
int 21h
xor ax,ax
mov ah,1h
int 21h
mov dl,al
sub dl,30h
cmp dl,9h
jle M1
sub dl,7h
M1:
mov cl,4h
shl dl,cl
int 21h
sub al,30h
cmp al, 9h
jle M2
sub al,7h
M2:
add dl,al
mov ax,4c00h
int 21h
main endp
code ends
end mainРешение задачи: «Пояснить код ассемблера»
textual
Листинг программы
data segment para public "data" ;начало сегмента данных
message db 'Enter: $' ;наша строка (приглашение для ввода двух символов с клавы)
data ends ;конец сегмента данных
stk segment stack ;начало сегмента стека
db 256 dup ("?") ;выделение памяти под стек
stk ends ;конец сегмента стека
code segment para public "code" ;начало сегмента кода
main proc ;начало процедуры
assume cs:code,ds:data,ss:stk ;сопоставление сегментных регистров и сегментов
mov ax,data
mov ds,ax ;инициализация сегмента данных через промежуточный регистр ax
mov ah,9 ;функция вывода сообщения на экран
mov dx,offset message ;адрес начала сообщения
int 21h ;прерывание, чтобы функция выполнилась
xor ax,ax ;обнуление регистра ax (здесь это не обязательно, можно удалить эту строку)
mov ah,1h ;функция ввода с клавиатуры символа с эхом
int 21h ;прерывание, чтобы функция выполнилась
;ASCII-код введенного символа помещается в регистр al
mov dl,al ;помещаем ASCII-код введенного символа в регистр dl
sub dl,30h ;предполагаем, что была нажата цифра. преобразовываем ASCII-код цифры в символ
cmp dl,9h ;проверяем, действительно ли была нажата цифра
jle M1 ;если была нажата цифра, то прыгаем на метку M1
sub dl,7h ;если была нажата буква, то дополнительно преобразовываем ASCII-код буквы в символ
M1: ;метка M1
mov cl,4h ;один шестнадцатеричный символ занимает 4 бита (полубайт)
shl dl,cl ;сдвигаем символ из младшего полубайта в старший
int 21h ;вводим второй символ. прерывание, чтобы функция ввода выполнилась
sub al,30h ;предполагаем, что была нажата цифра. преобразовываем ASCII-код цифры в символ
cmp al, 9h ;проверяем, действительно ли была нажата цифра
jle M2 ;если была нажата цифра, то прыгаем на метку M2
sub al,7h ;если была нажата буква, то дополнительно преобразовываем ASCII-код буквы в символ
M2: ;метка M2
add dl,al ;помещаем символ в младший полубайт
mov ax,4c00h;функция выхода из программы. код возврата - ноль
int 21h ;прерывание, чтобы функция выполнилась
main endp ;конец процедуры
code ends ;конец сегмента кода
end main ;указывается метка (процедура), с которой должна начаться выполняться программа
Объяснение кода листинга программы
- Объяснение кода: Этот код на ассемблере написан для ввода двух символов с клавиатуры и вывода их в консоль.
- Список действий:
- Инициализация сегмента данных через промежуточный регистр ax
- Вывод сообщения на экран с помощью функции int 21h
- Ввод первого символа с клавиатуры с эхом с помощью функции int 21h
- Проверка, была ли нажата цифра или буква
- Преобразование ASCII-кода в символ, если была нажата цифра
- Дополнительное преобразование ASCII-кода буквы в символ, если была нажата буква
- Ввод второго символа с клавиатуры с эхом с помощью функции int 21h
- Проверка, была ли нажата цифра или буква
- Преобразование ASCII-кода в символ, если была нажата цифра
- Дополнительное преобразование ASCII-кода буквы в символ, если была нажата буква
- Вывод двух символов в консоль с помощью функции int 21h
- Выход из программы с помощью функции int 21h