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

Объяснение кода листинга программы

Список элементов кода:

  1. Объявление переменных и сообщения: — mesg — сообщение Press Shift Left\Right! $ — msgLeft — сообщение Left Shift! $ — msgRight — сообщение Right Shift! $ — msgPress — сообщение Press a key to exit...$ — msgCrLf — сообщение $
  2. Макроопределение mDisp для вывода сообщений
  3. Начало программы: — mov ax, @data — настройка сегментного регистра — mov ds, ax — сегментный регистр равен значению регистра ax
  4. Вывод сообщения с помощью mDisp: — mDisp mesg — вывод сообщения Press Shift Left\Right! $
  5. Основной цикл программы: — hlt — ожидание нажатия клавиши — mov ah, 2 — подготовка к чтению регистра клавиши — int 16h — чтение регистра клавиши — test al, 2 — проверка нажата ли левая шифт — jnz leftShift — если нажата левая шифт, то переход к выводу сообщения msgLeft — test al, 1 — проверка нажата ли правая шифт — jz key — если нажата правая шифт, то переход к выводу сообщения msgRight
  6. Вывод сообщения msgLeft или msgRight: — mDisp msgLeft — вывод сообщения Left Shift! $ — mDisp msgRight — вывод сообщения Right Shift! $
  7. Очистка буфера клавиатуры: — mov ah, 1 — подготовка к чтению регистра клавиши — int 16h — чтение регистра клавиши — jz end_clr_key — если клавиша нажата, то переход к следующей итерации цикла — mov ah, 0 — подготовка к чтению регистра клавиши — int 16h — чтение регистра клавиши — jmp preview — переход к следующей итерации цикла
  8. Выполнение цикла до тех пор, пока не будет нажата клавиша: — mDisp msgPress — вывод сообщения Press a key to exit...$ — mov ah, 0 — ожидание нажатия кнопки — int 16h — чтение регистра клавиши — mDisp msgCrLf — вывод сообщения $
  9. Выход из программы: — mov ax, 4c00h — код выхода — int 21h — выход из программы
  10. Конец программы: — end main — окончание программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы