Переключение между видеостраницами клавишей F12, при этом на видеостранице можно вводить символы - Assembler

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

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

По идее, код работает правильно, но есть одна ошибочка... Для начала, задача такова: Переключаться между видеостраницами клавишей Ф12, при этом, на видеостранице можно вводить символы. Работает код верно, только вот когда жму Ф12, вставляет символ при переходе. Пробовал без эха функцию брать, но так нельзя символы вводить, и различить, по сути видеостраницы никак... Можете помочь с этим символом? Или набросать, чтоб сразу текст на странице был...?
.Model Small
Stack 256
.data
mes1 db 'Page 1 $'
mes2 db 'Page 2 $'
.code
.386
    Start:
        mov AX, @data
        
        mov DS, AX
        
        mov AH, 05h
        mov AL, 0
        int 10h
 
        mov AH, 00h
        mov AL, 0
        int 10h
 
        mov AH, 05h
        mov AL, 1
        int 10h
 
        mov AH, 00h
        mov AL, 0
        int 10h
 
        jmp m_1
    m_1:
        mov AH, 05h
        mov AL, 0
        int 10h
 
        mov AH, 01h
        int 21h     
 
        cmp AL, 86h
            je m_2
        jmp m_1
    m_2:
        mov AH, 05h
        mov AL, 1
        int 10h
 
        mov AH, 01h    
        int 21h
 
        cmp AL, 86h
            je m_1      
        jmp m_2
 
    Exit:
        mov AH, 04Ch            
        int 21h             
    END Start

Решение задачи: «Переключение между видеостраницами клавишей F12, при этом на видеостранице можно вводить символы»

textual
Листинг программы
.model tiny
.code
    org 100h
start:  push    0b800h
    pop es
    xor di,di
    mov ah, 20
    mov cx, 2
@1: push    cx
    mov cx, 2048;80*25*2
    rep stosw
    add ah,10h
    pop cx
    loop    @1
    xor di,di
@l: xor ax,ax
    int 16h
    cmp ah,1    ; esc
    jz  gtfo
    cmp ah, 44h ; F10 ; 58h ; F12
    jz  @F
    int 29h
    jmp @l
@F: xor di,1
    mov ax, di
    mov ah,5
    int 10h
    jmp @l
gtfo:   mov ax, 500h
    int 10h
    mov ax, 4c00h
    int 21h
    end start

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

  1. .model tiny - устанавливает модель памяти для программы (малый размер)
  2. .code - указывает на то, что следующий код является кодом программы
  3. org 100h - указывает на базовый адрес для сегмента кода (100h)
  4. push 0b800h - сохраняет сегментный адрес (0b800h) в стеке
  5. pop es - восстанавливает сегментный адрес из стека (для сегмента данных)
  6. xor di,di - обнуляет регистр DI
  7. mov ah, 20 - устанавливает код функции (20) для сегмента данных
  8. mov cx, 2 - устанавливает счетчик (2) для сегмента данных
  9. @1: - начало цикла
  10. push cx - сохраняет счетчик в стеке
  11. mov cx, 2048 - устанавливает размер видеостраницы (2048 байт)
  12. rep stosw - выполняет операцию заполнения (записывает 0 в видеостраницу) с использованием рекурсивного вызова
  13. add ah,10h - увеличивает код функции на 10 (переходит к следующей странице)
  14. pop cx - восстанавливает счетчик из стека
  15. loop @1 - продолжает цикл до тех пор, пока не будет выполнено условие
  16. xor di,di - обнуляет регистр DI
  17. @l: - начало условного блока
  18. xor ax,ax - обнуляет регистр AX
  19. int 16h - выполняет системный вызов (запрос на ввод символа)
  20. cmp ah,1 - сравнивает код функции с 1 (если равно, то это нажатие клавиши Esc)
  21. jz @gtfo - если условие выполнено, то переходит к блоку @gtfo
  22. cmp ah, 44h - сравнивает код функции с 44 (F10)
  23. jz @F - если условие выполнено, то переходит к блогу @F
  24. int 29h - выполняет системный вызов (запрос на ввод символа)
  25. jmp @l - возвращается к началу условного блока
  26. @F: - начало блока для обработки нажатия клавиши F10
  27. xor di,1 - устанавливает регистр DI равным 1
  28. mov ax, di - копирует значение регистра DI в регистр AX
  29. mov ah,5 - устанавливает код функции (5) для сегмента данных
  30. int 10h - выполняет системный вызов (вывод символа)
  31. jmp @l - возвращается к началу условного блока
  32. @gtfo: - начало блока для обработки нажатия клавиши Esc
  33. mov ax, 500h - устанавливает регистр AX равным 500h
  34. int 10h - выполняет системный вызов (вывод символа)
  35. mov ax, 4c00h - устанавливает регистр AX равным 4c00h
  36. int 21h - выполняет системный вызов (завершение работы программы)
  37. end start - указывает на конец программы

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

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