Shift левая, правая - Assembler
Формулировка задачи:
программа для определения какая Shift нажата (левая или правая).
переходит при нажатии любой кнопки, а должно показывать например нажата левая шифт, правая шифт или вы нажали не ту клавишу
.model small .stack 100h .data mesg db "Press Shift Left\Right! $" msgLeft db "Left Shift! $" msgRight db "Left Shift! $" .code main: mov ax, @data ; настраивается сегментный регистр mov ds, ax mov ah, 09 mov dx, offset mesg ; вывод сообщения int 21h key: mov ah, 2 int 16h test al, 2 jnz leftShift ; нажата левая шифт mov ah, 1 int 16h jz key ; переход на начало подпрограммы если ничего не нажато ;че-то нажато помимо шифтов и котролов mov ah, 0 int 16h ;в al ASCII код нажатой клавиши, в ah скан-код ; ... leftShift: mov ah, 09 mov dx, offset msgLeft ; вывод сообщения int 21h exit: mov ah, 01 ; ждет нажатия кнопок int 21h mov ax,4c00h ; выход int 21h end main
инфу нашёл но не знаю чё к чему
INT 16h, AH = 02h, 12h, 22h — Считать состояние клавиатуры
Ввод: АН = 02h (83/84-key), 12h (101/102-key), 22h (122-key)
Вывод: AL = байт состояния клавиатуры 1
АН = байт состояния клавиатуры 2 (только для функций 12h и 22h)
Байт состояния клавиатуры 1 (этот байт всегда расположен в памяти по адресу 0000h:0417h или 0040h:0017h):
Бит 7: Ins включена
Бит 6: CapsLock включена
Бит 5: NumLock включена
Бит 4: ScrollLock включена
Бит 3: Alt нажата (любая Alt для функции 02h, часто только левая Alt для 12h/22h)
Бит 2: Ctrl нажата (любая Ctrl)
Бит 1: Левая Shift нажата
Бит 0: Правая Shift нажата
Байт состояния клавиатуры 2 (этот байт всегда расположен в памяти по адресу 0000h:0418h или 0040h:0018h):
Бит 7: SysRq нажата
Бит 6: CapsLock нажата
Бит 5: NumLock нажата
Бит 4: ScrollLock нажата
Бит 3: Правая Alt нажата
Бит 2: Правая Ctrl нажата
Бит 1: Левая Alt нажата
Бит 0: Левая Ctrl нажата
Решение задачи: «Shift левая, правая»
textual
Листинг программы
.model small .stack 100h .data mesg db "Press Shift Left\Right! $" msgLeft db 0dh, 0ah, "Left Shift! $" msgRight db 0dh, 0ah, "Right Shift! $" msgPress db 0dh, 0ah, "Press a key to exit...$" msgCrLf db 0dh, 0ah, '$' ;------- mDisp MACRO aStr mov dx, offset aStr mov ah, 9 int 21h ENDM ;------- .code main: mov ax, @data ; настраивается сегментный регистр mov ds, ax mDisp mesg ; вывод сообщения key: hlt mov ah, 2 int 16h test al, 2 jnz leftShift ; нажата левая шифт test al, 1 jz key ; нажата правая шифт mDisp msgRight ; вывод сообщения JMP exit leftShift: mDisp msgLeft ; вывод сообщения exit: ; очистка буфера клавиатуры preview: mov ah, 1 int 16h jz end_clr_key mov ah, 0 int 16h jmp preview end_clr_key: mDisp msgPress mov ah, 0 ; ждет нажатия кнопок int 16h mDisp msgCrLf mov ax, 4c00h ; выход int 21h end main
Объяснение кода листинга программы
Список элементов кода:
- Объявление переменных и сообщения:
— mesg — сообщение
Press Shift Left\Right! $
— msgLeft — сообщениеLeft Shift! $
— msgRight — сообщениеRight Shift! $
— msgPress — сообщениеPress a key to exit...$
— msgCrLf — сообщение$
- Макроопределение mDisp для вывода сообщений
- Начало программы: — mov ax, @data — настройка сегментного регистра — mov ds, ax — сегментный регистр равен значению регистра ax
- Вывод сообщения с помощью mDisp:
— mDisp mesg — вывод сообщения
Press Shift Left\Right! $
- Основной цикл программы: — hlt — ожидание нажатия клавиши — mov ah, 2 — подготовка к чтению регистра клавиши — int 16h — чтение регистра клавиши — test al, 2 — проверка нажата ли левая шифт — jnz leftShift — если нажата левая шифт, то переход к выводу сообщения msgLeft — test al, 1 — проверка нажата ли правая шифт — jz key — если нажата правая шифт, то переход к выводу сообщения msgRight
- Вывод сообщения msgLeft или msgRight:
— mDisp msgLeft — вывод сообщения
Left Shift! $
— mDisp msgRight — вывод сообщенияRight Shift! $
- Очистка буфера клавиатуры: — mov ah, 1 — подготовка к чтению регистра клавиши — int 16h — чтение регистра клавиши — jz end_clr_key — если клавиша нажата, то переход к следующей итерации цикла — mov ah, 0 — подготовка к чтению регистра клавиши — int 16h — чтение регистра клавиши — jmp preview — переход к следующей итерации цикла
- Выполнение цикла до тех пор, пока не будет нажата клавиша:
— mDisp msgPress — вывод сообщения
Press a key to exit...$
— mov ah, 0 — ожидание нажатия кнопки — int 16h — чтение регистра клавиши — mDisp msgCrLf — вывод сообщения$
- Выход из программы: — mov ax, 4c00h — код выхода — int 21h — выход из программы
- Конец программы: — end main — окончание программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д