Вывод сообщения в зависимости от нажатой клавиши - Assembler
Формулировка задачи:
При вводе прописных латинских букв (в верхнем регистре) выдавать с новой строки на
экран сообщение "Введен символ <X>" ,а при нажатии этих клавиш в комбинации с Alt —
сообщение "Нажата комбинация Alt<X>" (<X> — соответствующий ASCII-символ).
Выход — Esc.
Решение задачи: «Вывод сообщения в зависимости от нажатой клавиши»
textual
Листинг программы
LOCALS .model small .stack 100h .data CrLf db 0Dh, 0Ah, '$' msgSimpleChar db 'Введен символ ' SimpleChar db ? db 0Dh, 0Ah, '$' msgAltChar db 'Нажата комбинация Alt' AltChar db ? db 0Dh, 0Ah, '$' kbState db ? kbAlt equ 08h kbCapsLock equ 40h kbRShift equ 01h kbLShift equ 02h kbShift equ kbLShift or kbRShift ScanCodeQ equ 10h ScanCodeP equ 19h ScanCodeA equ 1Eh ScanCodeL equ 26h ScanCodeZ equ 2Ch ScanCodeM equ 32h CharsList db 'QWERTYUIOPASDFGHJKLZXCVBNM' .code main proc mov ax, @data mov ds, ax @@Loop: ;чистаем состояние клавиши Alt mov ah, 02h int 16h mov kbState, al ;читаем состояние клавиатуры mov ah, 01h int 16h jz @@Loop ;если нет нажатия клавиш - перейти к началу цикла ;чтение нажатой клавиши mov ah, 00h int 16h ;если нажата клавиша Esc - выйти cmp al, 1Bh je @@Break ;проверка, что нажата клавиша символа в верхнем регистре ;т.е. нажат или Shift или CapsLock mov bl, kbState and bl, kbRShift mov bh, kbState and bh, kbLShift shr bh, 1 or bl, bh ;bl равен 1 если нажат хоть один из Shift mov bh, kbState and bh, kbCapsLock mov cl, 6 shr bh, cl xor bl, bh ;bl равен 1 если нажато что-то одно: или Shift или CapsLock jz @@Loop ;проверка, что нажата клавиша латинского алфавита mov al, ah @@1stRow_QP: cmp al, ScanCodeQ jb @@Loop cmp al, ScanCodeP ja @@2ndRow_AL sub al, ScanCodeQ jmp @@ShowMessage @@2ndRow_AL: cmp al, ScanCodeA jb @@Loop cmp al, ScanCodeL ja @@3rdRow_ZM sub al, ScanCodeA-10 jmp @@ShowMessage @@3rdRow_ZM: cmp al, ScanCodeZ jb @@Loop cmp al, ScanCodeM ja @@ShowMessage sub al, ScanCodeZ-10-9 @@ShowMessage: ;определение символа по скан-коду mov bx, 0 mov bl, al mov al, CharsList[bx] ;выбор сообщения, в зависимости от нажатия Alt test kbState, kbAlt jz @@NoAltPressed ;если нажата Alt mov AltChar, al ;поместить символ в сообщение mov ah, 09h ;вывести сообщение lea dx, msgAltChar int 21h jmp @@Loop @@NoAltPressed: ;если не нажата Alt mov SimpleChar, al ;поместить символ в сообщение mov ah, 09h ;вывести сообщение lea dx, msgSimpleChar int 21h jmp @@Loop @@Break: mov ax, 4C00h int 21h main endp end main
Объяснение кода листинга программы
LOCALS
: Определение локальных меток.model small
: Определение модели памяти для программы.stack 100h
: Определение размера стэка.data
: Начало сегмента данныхCrLf
: Объявление байтовой переменной с символами возврата каретки и перевода строкиmsgSimpleChar
: Объявление строки для сообщенияВведен символ
SimpleChar
: Объявление переменной для символаmsgAltChar
: Объявление строки для сообщенияНажата комбинация Alt
AltChar
: Объявление переменной для символаkbState
: Объявление переменной для состояния клавишиkbAlt
,kbCapsLock
,kbRShift
,kbLShift
,kbShift
: Определение констант для различных клавишScanCodeQ
,ScanCodeP
,ScanCodeA
,ScanCodeL
,ScanCodeZ
,ScanCodeM
: Определение констант для скан-кодов клавишCharsList
: Объявление строки с латинским алфавитом.code
: Начало сегмента кодаmain proc
: Начало процедурыmain
mov ax, @data; mov ds, ax
: Инициализация сегмента данных@@Loop
: Метка начала цикла ... Далее идет описание алгоритма обработки нажатой клавиши, вывода сообщений в зависимости от нажатой клавиши, и завершение программы. Этот код написан на языке Assembler и предназначен для вывода сообщений в зависимости от клавиши, нажатой пользователем.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д