Вывод сообщения в зависимости от нажатой клавиши - Assembler

Узнай цену своей работы

Формулировка задачи:

При вводе прописных латинских букв (в верхнем регистре) выдавать с новой строки на экран сообщение "Введен символ <X>" ,а при нажатии этих клавиш в комбинации с Alt — сообщение "Нажата комбинация Alt<X>" (<X> — соответствующий ASCII-символ). Выход — Esc.

Решение задачи: «Вывод сообщения в зависимости от нажатой клавиши»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf            db      0Dh, 0Ah, '$'
  9.         msgSimpleChar   db      'Введен символ '
  10.         SimpleChar      db      ?
  11.                         db      0Dh, 0Ah, '$'
  12.         msgAltChar      db      'Нажата комбинация Alt'
  13.         AltChar         db      ?
  14.                         db      0Dh, 0Ah, '$'
  15.         kbState         db      ?
  16.         kbAlt           equ     08h
  17.         kbCapsLock      equ     40h
  18.         kbRShift        equ     01h
  19.         kbLShift        equ     02h
  20.         kbShift         equ     kbLShift or kbRShift
  21.  
  22.         ScanCodeQ       equ     10h
  23.         ScanCodeP       equ     19h
  24.         ScanCodeA       equ     1Eh
  25.         ScanCodeL       equ     26h
  26.         ScanCodeZ       equ     2Ch
  27.         ScanCodeM       equ     32h
  28.  
  29.         CharsList       db      'QWERTYUIOPASDFGHJKLZXCVBNM'
  30. .code
  31.  
  32. main    proc
  33.         mov     ax,     @data
  34.         mov     ds,     ax
  35.  
  36. @@Loop:
  37.         ;чистаем состояние клавиши Alt
  38.         mov     ah,     02h
  39.         int     16h
  40.         mov     kbState,        al
  41.         ;читаем состояние клавиатуры
  42.         mov     ah,     01h
  43.         int     16h
  44.         jz      @@Loop  ;если нет нажатия клавиш - перейти к началу цикла
  45.         ;чтение нажатой клавиши
  46.         mov     ah,     00h
  47.         int     16h
  48.         ;если нажата клавиша Esc - выйти
  49.         cmp     al,     1Bh
  50.         je      @@Break
  51.         ;проверка, что нажата клавиша символа в верхнем регистре
  52.         ;т.е. нажат или Shift или CapsLock
  53.         mov     bl,     kbState
  54.         and     bl,     kbRShift
  55.         mov     bh,     kbState
  56.         and     bh,     kbLShift
  57.         shr     bh,     1
  58.         or      bl,     bh      ;bl равен 1 если нажат хоть один из Shift
  59.         mov     bh,     kbState
  60.         and     bh,     kbCapsLock
  61.         mov     cl,     6
  62.         shr     bh,     cl
  63.         xor     bl,     bh      ;bl равен 1 если нажато что-то одно: или Shift или CapsLock
  64.         jz      @@Loop
  65.         ;проверка, что нажата клавиша латинского алфавита
  66.         mov     al,     ah
  67. @@1stRow_QP:
  68.         cmp     al,     ScanCodeQ
  69.         jb      @@Loop
  70.         cmp     al,     ScanCodeP
  71.         ja      @@2ndRow_AL
  72.         sub     al,     ScanCodeQ
  73.         jmp     @@ShowMessage
  74. @@2ndRow_AL:
  75.         cmp     al,     ScanCodeA
  76.         jb      @@Loop
  77.         cmp     al,     ScanCodeL
  78.         ja      @@3rdRow_ZM
  79.         sub     al,     ScanCodeA-10
  80.         jmp     @@ShowMessage
  81. @@3rdRow_ZM:
  82.         cmp     al,     ScanCodeZ
  83.         jb      @@Loop
  84.         cmp     al,     ScanCodeM
  85.         ja      @@ShowMessage
  86.         sub     al,     ScanCodeZ-10-9
  87. @@ShowMessage:
  88.         ;определение символа по скан-коду
  89.         mov     bx,     0
  90.         mov     bl,     al
  91.         mov     al,     CharsList[bx]
  92.         ;выбор сообщения, в зависимости от нажатия Alt
  93.         test    kbState,        kbAlt
  94.         jz      @@NoAltPressed
  95.         ;если нажата Alt
  96.         mov     AltChar,        al      ;поместить символ в сообщение
  97.         mov     ah,     09h             ;вывести сообщение
  98.         lea     dx,     msgAltChar
  99.         int     21h
  100.         jmp     @@Loop
  101. @@NoAltPressed:
  102.         ;если не нажата Alt
  103.         mov     SimpleChar,     al      ;поместить символ в сообщение
  104.         mov     ah,     09h             ;вывести сообщение
  105.         lea     dx,     msgSimpleChar
  106.         int     21h
  107.         jmp     @@Loop
  108.  
  109. @@Break:
  110.  
  111.         mov     ax,     4C00h
  112.         int     21h
  113. main    endp
  114.  
  115. end     main

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

  1. LOCALS: Определение локальных меток
  2. .model small: Определение модели памяти для программы
  3. .stack 100h: Определение размера стэка
  4. .data: Начало сегмента данных
  5. CrLf: Объявление байтовой переменной с символами возврата каретки и перевода строки
  6. msgSimpleChar: Объявление строки для сообщения Введен символ
  7. SimpleChar: Объявление переменной для символа
  8. msgAltChar: Объявление строки для сообщения Нажата комбинация Alt
  9. AltChar: Объявление переменной для символа
  10. kbState: Объявление переменной для состояния клавиши
  11. kbAlt, kbCapsLock, kbRShift, kbLShift, kbShift: Определение констант для различных клавиш
  12. ScanCodeQ, ScanCodeP, ScanCodeA, ScanCodeL, ScanCodeZ, ScanCodeM: Определение констант для скан-кодов клавиш
  13. CharsList: Объявление строки с латинским алфавитом
  14. .code: Начало сегмента кода
  15. main proc: Начало процедуры main
  16. mov ax, @data; mov ds, ax: Инициализация сегмента данных
  17. @@Loop: Метка начала цикла ... Далее идет описание алгоритма обработки нажатой клавиши, вывода сообщений в зависимости от нажатой клавиши, и завершение программы. Этот код написан на языке Assembler и предназначен для вывода сообщений в зависимости от клавиши, нажатой пользователем.

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


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

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

5   голосов , оценка 4.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы