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