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