Переключение между видеостраницами клавишей 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
Объяснение кода листинга программы
- .model tiny - устанавливает модель памяти для программы (малый размер)
- .code - указывает на то, что следующий код является кодом программы
- org 100h - указывает на базовый адрес для сегмента кода (100h)
- push 0b800h - сохраняет сегментный адрес (0b800h) в стеке
- pop es - восстанавливает сегментный адрес из стека (для сегмента данных)
- xor di,di - обнуляет регистр DI
- mov ah, 20 - устанавливает код функции (20) для сегмента данных
- mov cx, 2 - устанавливает счетчик (2) для сегмента данных
- @1: - начало цикла
- push cx - сохраняет счетчик в стеке
- mov cx, 2048 - устанавливает размер видеостраницы (2048 байт)
- rep stosw - выполняет операцию заполнения (записывает 0 в видеостраницу) с использованием рекурсивного вызова
- add ah,10h - увеличивает код функции на 10 (переходит к следующей странице)
- pop cx - восстанавливает счетчик из стека
- loop @1 - продолжает цикл до тех пор, пока не будет выполнено условие
- xor di,di - обнуляет регистр DI
- @l: - начало условного блока
- xor ax,ax - обнуляет регистр AX
- int 16h - выполняет системный вызов (запрос на ввод символа)
- cmp ah,1 - сравнивает код функции с 1 (если равно, то это нажатие клавиши Esc)
- jz @gtfo - если условие выполнено, то переходит к блоку @gtfo
- cmp ah, 44h - сравнивает код функции с 44 (F10)
- jz @F - если условие выполнено, то переходит к блогу @F
- int 29h - выполняет системный вызов (запрос на ввод символа)
- jmp @l - возвращается к началу условного блока
- @F: - начало блока для обработки нажатия клавиши F10
- xor di,1 - устанавливает регистр DI равным 1
- mov ax, di - копирует значение регистра DI в регистр AX
- mov ah,5 - устанавливает код функции (5) для сегмента данных
- int 10h - выполняет системный вызов (вывод символа)
- jmp @l - возвращается к началу условного блока
- @gtfo: - начало блока для обработки нажатия клавиши Esc
- mov ax, 500h - устанавливает регистр AX равным 500h
- int 10h - выполняет системный вызов (вывод символа)
- mov ax, 4c00h - устанавливает регистр AX равным 4c00h
- int 21h - выполняет системный вызов (завершение работы программы)
- end start - указывает на конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д