Выводить и скрывать символ ‘*’ в пределах 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.
- Выход из рекурсии и возврат в основную программу.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д