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