Выводить и скрывать символ ‘*’ в пределах 1 секунды - Assembler
Формулировка задачи:
На экране в координатах (1,1), (1,78), (23,1), (23,78) выводить и скрывать символ ‘*’ в пределах 1 секунды. Выход из программы по нажатию клавиши Esc. Напишите код пожалуйста в одном сегменте. Заранее спасибо!!!
Решение задачи: «Выводить и скрывать символ ‘*’ в пределах 1 секунды»
textual
Листинг программы
.model small .386 .stack 100h .data .code start: mov ax,@data mov ds,ax mov ah,00h mov al,03h int 10h push 0B800h pop es again: mov ax,022Ah xor di,di mov word ptr es:[di],ax add di,158 mov word ptr es:[di],ax add di,3682 mov word ptr es:[di],ax add di,158 mov word ptr es:[di],ax call delay mov ax,0000h xor di,di mov word ptr es:[di],ax add di,158 mov word ptr es:[di],ax add di,3682 mov word ptr es:[di],ax add di,158 mov word ptr es:[di],ax call delay push es push 0040h pop es mov bx,word ptr es:[001Ah] mov ax,word ptr es:[bx] cmp al,1Bh je exit pop es jmp again exit: mov ah,4Ch mov al,00h int 21h delay proc push ax push bx push cx push dx xor ah,ah int 1Ah mov bx,dx add bx,30 tik: xor ah,ah int 1Ah cmp dx,bx jbe tik pop dx pop cx pop bx pop ax ret delay endp end start
Объяснение кода листинга программы
- Установка начального сегмента данных и кода на 0000h (код применим только для сегмента данных).
- Создание стека размером 100 байт.
- Вставка в стек сегмента памяти 0B800h, который является сегментом экрана.
- Извлечение из стека сегмента экрана и сохранение его в регистре ES.
- Переход к блоку кода, который выводит символ на экран.
- Заполнение экрана символами '*' в 4 строки по 64 символа в каждой.
- Первая строка: 001Bh (код символа '*') записывается в 4 байта (слова) в строке, начиная с адреса 001Ah в сегменте ES.
- Если в регистрах AL и BL не осталось символов '*', то происходит переход к блоку кода после цикла.
- Если в регистрах AL и BL ещё остались символы '*', то происходит рекурсивный вызов процедуры delay, которая имитирует задержку в 1 секунду.
- Передача в регистры BX, DX, CX и AX адреса начала строки с символами '*'.
- Деление на 30 и последующее инкрементирование BX на 30 (возврат к следующей строке с символами '*').
- Если значение в регистре DX не равно значению в регистре BX, то происходит рекурсивный вызов процедуры delay.
- Выход из рекурсии и возврат в основную программу.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д