Ввод клавиш или комбинаций и вывод соответствующих сообщений - Assembler

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

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

Преподаватель уволился, а лабу нужно сделать. Нам прочитали всего 4 лекции, а новый, заменяющий, преподаватель в ассемблере только основы знает, потому будет смотреть только на результат и помогать не будет. Помогите, пожалуйста, понять где ошибка. Программа "собирается" но в итоге выводит сообщение с кучей символов и пробелов и на клавиатуру не реагирует. Само задание звучит так: Написать программу, которая проверяет нажатие клавиш (комбинаций клавиш) в соответствии с вариантом задания и выводит соответствующие сообщения. В моем случае F8 и CtrlF8
.MODEL Tiny
.CODE
ORG 100h
 
Start:
 
        mov ah,9
        lea dx,Question
        int 21h            ; mess output
RepeatEnter:
                xor     ah,0       ; AH = 0
        int 16h            ; wait pressed
                ;or     al,20h         
 
                cmp     al,66h
        je  F8Pressed     ; pressed 'F8'
 
                cmp     al,101
        jne RepeatEnter    ; pressed not 'CtrlF8' (not 'F8')
 
        lea dx,CtrlF8Message  ; pressed 'CtrlF8'
        jmp ShowMessage
F8Pressed:
        lea dx,F8Message
ShowMessage:
        mov ah,9
        int 21h            ; message output
 
        int 20h            ; exit
 
Question    db  'Choose your side :) (F8/CtrlF8)?$'
F8Message       db      13,10,'PRESSED "F8"$'
CtrlF8Message   db      13,10,'PRESSED "CtrlF8"$'
 
END     Start

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

textual
Листинг программы
stek segment stack 'stack'
    db  200h dup (?)
stek ends
 
data segment
    Question    db  'Choose your side :) (F8/CtrlF8)?$'
    F8Message       db      'PRESSED "F8"$'
    CtrlF8Message   db      'PRESSED "CtrlF8"$'
data ends
code segment
    assume cs:code, ds:data
Start:
    mov ax,data
    mov ds,ax
 
        mov ah,9
        lea dx,Question
        int 21h            ; mess output
RepeatEnter:
        xor     ah,ah       ; AH = 0
        int 16h            ; wait pressed
    cmp     ah,42h
        je  F8Pressed     ; pressed 'F8'
        cmp     ah,65h
        jne RepeatEnter    ; pressed not 'CtrlF8' (not 'F8')
        lea dx,CtrlF8Message  ; pressed 'CtrlF8'
        jmp ShowMessage
F8Pressed:
        lea dx,F8Message
ShowMessage:
        mov ah,9
        int 21h            ; message output
 
;        int 20h            ; exit
 
        mov ah, 4ch
                int 21h
 
 code ends
END     Start

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

  1. В начале кода определены сегменты стека и данных, а также переменные, используемые в коде.
  2. Код начинается с перемещения сегмента данных в регистр AX с помощью команды MOV.
  3. Затем команда MOV используется для вывода сообщения с помощью функции BIOS INT 21h.
  4. Далее следует цикл, который продолжается до тех пор, пока не будет нажата клавиша 'F8' или 'CtrlF8'.
  5. Если нажата клавиша 'F8', то выводится соответствующее сообщение с помощью команды LEA и функции BIOS INT 21h.
  6. Если нажата клавиша 'CtrlF8', то выводится соответствующее сообщение с помощью команды LEA и функции BIOS INT 21h.
  7. После вывода сообщения цикл повторяется.
  8. Если ни одна из клавиш не нажата, то выводится сообщение об ошибке.
  9. После выхода из цикла выводится сообщение с помощью функции BIOS INT 21h.
  10. В конце кода выводится сообщение об успешном выполнении программы с помощью функции BIOS INT 21h.
  11. Функция BIOS INT 20h используется для выхода из программы.

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


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

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

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