[emu8086] Перемешивание цветных прямоугольников на экране - Assembler
Формулировка задачи:
Добрый вечер. Я в ассемблере плохо разбираюсь, поэтому прошу вас о помощи.
По заданию нужно условно разделить весь экран на прямоугольники размером 10х5 символов; при нажатии кнопки Enter содержимое прямоугольников экрана должно перемешиваться случайным образом между собой до нажатия любой клавиши.
С моим уровнем владения ассемблера смог нарисовать 4 прямоугольника10х5, разного цвета.
пробовал менять цвет прямоугольников, но ничего не получается.
Помогите с заданием пожалуйста, за ранее спасибо всем.
вот мой код:
.model small .code start: mov ax,3 int 10h mov ax,0B800h mov es,ax mov di,0 mov ax,0FDBh call strip mov di,20 mov ah,0Ch call strip mov ah,9 mov di,80*10+0 call strip mov ah,10 mov di,40*20+20 call strip mov ah,0 int 16h mov ah,4Ch int 21h strip proc mov cx,5 a1: push cx mov cx,10 rep stosw add di,140 pop cx loop a1 retn strip endp end start
Решение задачи: «[emu8086] Перемешивание цветных прямоугольников на экране»
textual
Листинг программы
main proc mov ax, @data mov ds, ax ;инициализация ;-ГПСЧ call Randomize ;-экрана call FillScreen jmp @@WaitKey @@Process: ;перемешивание прямоугольников mov ax, 40 call Random mov si, ax mov ax, 40 call Random mov di, ax ;ожидание нажатия ENTER @@WaitKey: mov ah, 00h int 16h cmp al, kbEnter jnz @@Break call Exchange ;-проверка нажатия любой клавиши mov ah, 01h int 16h jz @@Process @@Break: ;завершение программы mov ax, 4C00h int 21h main endp
Объяснение кода листинга программы
- Переменные:
- ax (аксиальный регистр) используется для хранения данных и команд в коде.
- ds (сегментный регистр) используется для указания сегмента данных.
- si (индексный регистр) используется для хранения индекса одного из перемешиваемых прямоугольников.
- di (индексный регистр) используется для хранения индекса второго прямоугольника.
- al (аксиальный регистр) используется для хранения нажатой клавиши.
- Процедуры:
- @@Process (подпроцедура) используется для перемешивания прямоугольников на экране.
- @@WaitKey (подпроцедура) используется для ожидания нажатия клавиши ENTER.
- Exchange (подпроцедура) используется для обмена значениями двух переменных.
- Команды:
- mov (команда пересылки данных) используется для перемещения данных между регистрами.
- call (команда вызова подпрограммы) используется для вызова подпроцедур.
- int (команда ввода/вывода) используется для ввода/вывода данных с клавиатуры.
- jmp (команда перехода) используется для перехода к другой части кода.
- jnz (команда перехода, если условие не равно нулю) используется для проверки нажатия клавиши.
- cmp (команда сравнения) используется для сравнения двух значений.
- and (команда логического И) используется для логического И двух значений.
- not (команда логического отрицания) используется для получения противоположного значения.
- or (команда логического ИЛИ) используется для логического ИЛИ двух значений.
- sar (команда сдвига вправо с заполнение) используется для сдвига числа вправо.
- rol (команда сдвига влево с заполнение) используется для сдвига числа влево.
- xor (команда побитового исключающего ИЛИ) используется для побитового исключающего ИЛИ двух значений.
- Используемые значения:
- 40 (значение, используемое для инициализации переменных si и di)
- 00h (значение, используемое для вывода сообщения)
- kbEnter (константа, обозначающая нажатие клавиши ENTER)
- 4C00h (значение, используемое для завершения программы)