Как вывести ASCII-код введенного с клавиатуры символа? - Assembler
Формулировка задачи:
Вот мой код, как мне сделать, чтобы когда я нажимал клавишу, выводился ее аски-символ? Я так понимаю, в AL лежит сам символ.
c_s segment assume cs:c_s begin: mov ah,0h ;функция установки режима mov al,3h ;номер режима int 10h ;прерывание m1: mov ah,8h ; функция считывания символа с клавиатуры int 21h ; считывание одного символа с клавиатуры (без эха) cmp al,27 ;считанный символ помещается в AL mov ah,9h ;функция вывода символа на экран, символ уже в AL mov bh,0 ;номер дисплейной страницы mov bl,15 ;цвет символа белый mov cx,1 ;кол-во символов int 10h je m2 ;если была нажата клавиша "Esc", то на m2 jmp m1 ;иначе, снова запрашивается ввод символа (на m1) m2: mov ah,4ch int 21h c_s ends end begin
Решение задачи: «Как вывести ASCII-код введенного с клавиатуры символа?»
textual
Листинг программы
.model compact .stack .code begin: mov ah,0h ;функция установки режима mov al,3h ;номер режима int 10h ;прерывание mov bx,0Fh ;BH - номер дисплейной страницы, BL - цвет символа белый m1: xor ax,ax ; функция считывания символа с клавиатуры int 16h ; считывание одного символа с клавиатуры (без эха) mov ah,0Eh ;функция вывода символа на экран, символ уже в AL int 10h cmp al, 27 ;если HE была нажата клавиша "Esc", то на m1 pushf call hexen mov al,20h int 29h popf jne m1 mov ah,4ch int 21h hexen: aam 16 mov dx,ax xchg ah,al call nibble mov ax,dx nibble: and al, 0Fh Add Al, 90h Daa Adc Al, 40h Daa int 29h ret end begin
Объяснение кода листинга программы
- .model compact - устанавливает модель памяти, в данном случае компактную
- .stack - указывает на то, что далее будет определён стек подпрограмм
- .code - указывает на то, что далее будет определён код программы
- begin: - метка начала программы
- mov ah,0h - функция установки режима
- mov al,3h - номер режима
- int 10h - прерывание
- mov bx,0Fh - BH - номер дисплейной страницы, BL - цвет символа белый
- m1: xor ax,ax - функция считывания символа с клавиатуры
- int 16h - считывание одного символа с клавиатуры (без эха)
- mov ah,0Eh - функция вывода символа на экран, символ уже в AL
- int 10h - вывод символа на экран
- cmp al, 27 - если нажата клавиша
Esc
, то переход на m1 - pushf - сохранение флага в стеке
- call hexen - вызов подпрограммы hexen
- mov al,20h - установка AL = 20h
- int 29h - перевод строки
- popf - восстановление флага из стека
- jne m1 - переход на m1, если флаг не равен нулю
- mov ah,4ch - функция завершения работы программы
- int 21h - завершение работы программы
- hexen: - метка подпрограммы
- aam 16 - десятичное значение переводится в шестнадцатеричное
- mov dx,ax - DX получает значение AX
- xchg ah,al - AH и AL меняются местами
- call nibble - вызов подпрограммы nibble
- mov ax,dx - AX получает значение DX
- nibble: and al, 0Fh - AL сдвигается вправо на 4 бита и AND с 0Fh
- Add Al, 90h - к AL добавляется 90h
- Daa - флаг переноса устанавливается в 0
- Adc Al, 40h - к AL добавляется 40h
- Daa - флаг переноса устанавливается в 0
- int 29h - перевод строки
- ret - возврат в предыдущую подпрограмму
- end begin - метка конца программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д