Выводить и скрывать символ ‘*’ в пределах 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

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

  1. Установка начального сегмента данных и кода на 0000h (код применим только для сегмента данных).
  2. Создание стека размером 100 байт.
  3. Вставка в стек сегмента памяти 0B800h, который является сегментом экрана.
  4. Извлечение из стека сегмента экрана и сохранение его в регистре ES.
  5. Переход к блоку кода, который выводит символ на экран.
  6. Заполнение экрана символами '*' в 4 строки по 64 символа в каждой.
  7. Первая строка: 001Bh (код символа '*') записывается в 4 байта (слова) в строке, начиная с адреса 001Ah в сегменте ES.
  8. Если в регистрах AL и BL не осталось символов '*', то происходит переход к блоку кода после цикла.
  9. Если в регистрах AL и BL ещё остались символы '*', то происходит рекурсивный вызов процедуры delay, которая имитирует задержку в 1 секунду.
  10. Передача в регистры BX, DX, CX и AX адреса начала строки с символами '*'.
  11. Деление на 30 и последующее инкрементирование BX на 30 (возврат к следующей строке с символами '*').
  12. Если значение в регистре DX не равно значению в регистре BX, то происходит рекурсивный вызов процедуры delay.
  13. Выход из рекурсии и возврат в основную программу.
  14. Завершение работы программы.

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


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

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

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