Вывод ASCII кодов символов - Assembler (223794)
Формулировка задачи:
Изучаю Flat Assembler, и возникла проблема. Есть задача, написать программу,которая выводила бы ASCII коды ВСЕХ клавиш, а если прочитанный символ равен 0, то выводила бы расширенный код.
Как отредактировать данный код для этой задачи?
Org 100h
jmp start
start:
m1: xor ax,ax ; функция считывания символа с клавиатуры
int 16h ; считывание одного символа с клавиатуры (без эха)
mov ah,01h ;функция вывода символа на экран, символ уже в AL
cmp al, 27 ;если HE была нажата клавиша "Esc", то на m1
pushf ;Сохраняем значения флагов
call hexen ;Вызываем функцию перевода в 16-ое число
mov al,20h ;Ставим пробел
int 29h ;Вывод символа на экран в режиме телетайпа
popf ;Извлекаем значения флагов
jne m1 ; Если zf = 0, продолжаем ожидать ввода, а так же, если не была нажата Esc
hexen:
aam 16 ;ASCII коррекция регистра AX после умножения
push ax ;Сохраняем значение AX
mov dl, ah ;Обмениваем значения
mov ah, al ;Обмениваем значения
mov al,dl ;Обмениваем значени
call nibble ;
pop ax ;Восстанавливаем значение AX
nibble:
and al, 0Fh
Add Al, 90h ;Прибавление 90h к содержимому регистра Al
Daa ;Десятичная коррекция AL после сложения
Adc Al, 40h ;Прибавление 40h к содержимому регистра AL с переносом в CF
Daa ;Десятичная коррекция AL после сложения
int 29h ;Вывод символа на экран в режиме телетайпа
ret ;Возвращаемся в место вызова
int 20hРешение задачи: «Вывод ASCII кодов символов»
textual
Листинг программы
; Fasm code......... org 100h jmp start start: xor ax,ax ; клавиша.. int 16h ; cmp al,27 ; esc? je exit ; or al,al ; расширенный? jnz okey ; xchg ah,al ; да - отправляем scan в AL okey: call hexAX ; выводим на экран в HEX mov al,' ' ; разделитель int 29h ; jmp start ; на повтор.. ; exit: ret ; return dos ;------------------------------------------------------------------ ; процедура выводит АL на экран в HEX hexAX: shl ax,8 ; отправляем AL в AH xchg dx,ax ; DX = AX mov cx,2 ; число цифр для вывода @@: shld ax,dx,4 ; получить в AL очередную цифру rol dx,4 ; удалить ее из DX and al,0Fh ; оставить в AL только эту цифру cmp al,0Ah ; три команды, переводящие sbb al,69h ; ..шестнадцатеричную цифру в AL das ; ..в соответствующий ASCII-код int 29h ; вывод на экран loop @b ; повторить для всех цифр ret
Объяснение кода листинга программы
Список элементов:
- Объявление начала кода и точки входа.
- Переменная
axинициализируется значением 0. - Проверка на нажатие клавиши Esc.
- Если нажата клавиша Esc, выполняется команда
exitи возвращается управление DOS. - Переменная
alустанавливается в 1, что означает, что символ является расширенным. - Если
alне равен 1, то есть это не расширенный символ, выполняется командаokey. - Выполняется команда
hexAX, которая выводит шестнадцатеричное значениеalв регистре AH. - Переменная
alустанавливается в значение пробела. - Выполняется команда
int 29h, которая выводит символ на экран. - Команда
jmp startпереходит к началу цикла. - Процедура
hexAXвыводит шестнадцатеричное значениеalв регистре AH. - Переменная
cxинициализируется значением 2, что означает, что будет выведено две цифры. - Цикл начинается с команды
shld ax,dx,4, которая получает следующую цифру из регистра DX в регистр AX. - Команда
rol dx,4удаляет только что прочитанную цифру из регистра DX. - Команда
and al,0Fhоставляет в регистре AX только текущую цифру. - Команда
cmp al,0Ahсравнивает текущую цифру с ASCII-кодом символаtab. - Если текущая цифра равна ASCII-коду символа
tab, выполняется командаsbb al,69h, которая заменяет цифру на ASCII-код символаu. - Команда
dasприводит регистр AH к двоичному представлению. - Выполняется команда
int 29h, которая выводит символ на экран. - Цикл повторяется до тех пор, пока все цифры не будут выведены.
- Команда
retвозвращает управление в вызывающую программу.