Создать программу, которая переводит экран в графический режим - Assembler
Формулировка задачи:
"Создать программу, которая переводит экран в графический режим 13h (320x200), заселяет
его точками случайным образом, после чего эти точки эволюционируют согласно законам алгоритма
«Жизнь»: если у точки меньше двух или больше трех соседей, она погибает, а если у пустой позиции
есть три соседа, в ней появляется новая точка."
мой кодне работает)
помогите исправить пожалуйста)
;lifebios.asm ;Игра "жизнь" на поле 320х240 исполбзующая вывод на экран средства BIOS .model small .stack 100h .code .386 .fardata? ;Сегмент инициализации данных db 320*200+1 dup(?) ;Содержит массив ячеек main: push FAR_BSS;Сегментный адрес буфера в дс pop ds ;Заполнение массива ячеек псевдослучайными значениями xor ax,ax int 1Ah ;ф-ия АН=0 Int 1Ah:получить текущее ;ДХ теперь содержит число секунд,прошелших ;с момента включения компьютера, ;которое используется как начальное значение ;генератора случайных чисел mov di,320*200+1 ;максимальный номер ячейки fill_buffer: imul dx,4E35h;Простой генератор случайных чисел inc dx;из двух команд mov ax,dx;Текущее случайное число копируется в АХ shr ax,15;От него остаётся только один бит, mov byte ptr [di],al;и в массив копируется 00,если ячейка ;пуста,и 01,если заселена dec di;следующая ячейка jnz fill_buffer;Продолжить цикл,если ДИ не стал равен нулю. mov ax,0013h int 10h ;Основной цикл new_cycle: ; ; mov di,320*200+1; step_1: mov al,byte ptr [di+1] add al,byte ptr [di-1] add al,byte ptr [di+319] add al,byte ptr [di-319] add al,byte ptr [di+320] add al,byte ptr [di-320] add al,byte ptr [di+321] add al,byte ptr [di-321] shl al,4 or byte ptr [di],al dec di jnz step_1 mov di,320*200+1 flip_cycle: mov al,byte ptr [di] shr al,4 cmp al,3 je birth cmp al,2 je f_c_continue mov byte ptr [di],0 jmp short f_c_continue birth: mov byte ptr [di],1 f_c_continue: and byte ptr [di],0Fh dec di jnz flip_cycle mov si,320*200+1 mov cx,319 mov dx,199 zdisplay: mov al,byte ptr [si] mov ah,0Ch int 10h dec si dec cx jnz zdisplay mov cx,319 dec dx jnz zdisplay mov ah,1 int 16h jz new_cycle mov ax,0003h int 10h mov ax,4C00h int 21h end main
Решение задачи: «Создать программу, которая переводит экран в графический режим»
textual
Листинг программы
; masm dos exe # ; Игра "Жизнь" на поле 320x200, использующая вывод на экран средствами BIOS .286 .model small .stack 100h ; явное задание стека - для EXE-программ .code start: push FAR_BSS ; сегментный адрес буфера в DS pop ds ; заполнение массива ячеек псевдослучайными значениями xor ax,ax int 1Ah ; Функция AH = 0 INT 1Ah: получить текущее время ; DX теперь содержит число секунд, прошедших ; с момента включения компьютера, которое ; используется как начальное значение генератора ; случайных чисел mov di,320*200+1 ; максимальный номер ячейки fill_buffer: imul dx,4E35h ; простой генератор случайных чисел inc dx ; из двух команд mov ax,dx ; текущее случайное число копируется в AX shr ax,15 ; от него оставляется только один бит, mov byte ptr [di],al ; и в массив копируется 00, если ячейка ; пуста, и 01, если заселена dec di ; следующая ячейка jnz fill_buffer ; продолжить цикл, если DI не стал равен нулю mov ax,0013h ; графический режим 320x200, 256 цветов int 10h ; основной цикл ; Шаг 1: для каждой ячейки вычисляется число соседей и записывается в старшие 4 ; бита этой ячейки new_cycle:mov di,320*200+1 ; максимальный номер ячейки step_1: mov al,byte ptr [di+1] ; в AL вычисляется сумма add al,byte ptr [di-1] ; значений восьми соседних ячеек, add al,byte ptr [di+319] ; при этом в младших четырех add al,byte ptr [di-319] ; битах накапливается число add al,byte ptr [di+320] ; соседей add al,byte ptr [di-320] add al,byte ptr [di+321] add al,byte ptr [di-321] shl al,4 ; теперь старшие четыре бита AL - число ; соседей текущей ячейки or byte ptr [di],al ; поместить их в старшие четыре бита ; текущей ячейки dec di ; следующая ячейка jnz step_1 ; продолжить цикл, если DI не стал равен нулю ; Шаг 2: изменение состояния ячеек в соответствии с полученными в шаге 1 ; значениями числа соседей mov di,320*200+1 ; максимальный номер ячейки flip_cycle:mov al,byte ptr [di] ; считать ячейку из массива shr al,4 ; AL = число соседей cmp al,3 ; если число соседей = 3, je birth ; ячейка заселяется, cmp al,2 ; если число соседей = 2, je f_c_continue ; ячейка не изменяется, mov byte ptr [di],0 ; иначе - ячейка погибает jmp short f_c_continue birth: mov byte ptr [di],1 f_c_continue:and byte ptr [di],0Fh ; обнулить число соседей в старших битах ; ячейки dec di ; следующая ячейка jnz flip_cycle ; Вывод массива на экран средствами BIOS mov si,320*200+1 ; максимальный номер ячейки mov cx,319 ; максимальный номер столбца mov dx,199 ; максимальный номер строки zdisplay:mov al,byte ptr [si] ; цвет точки (00 - черный, 01 - синий) mov ah,0Ch ; номер видеофункции в AH int 10h ; вывести точку на экран dec si ; следующая ячейка dec cx ; следующий номер столбца jns zdisplay ; если столбцы не закончились - продолжить mov cx,319 ; иначе: снова максимальный номер столбца в CX dec dx ; и следующий номер строки в DX jns zdisplay ; если и строки закончились - выход из цикла mov ah,1 ; если не нажата клавиша int 16h jz new_cycle ; следующий шаг жизни mov ax,3 ; восстановить текстовый режим int 10h mov ah,4Ch ; и завершить программу int 21h .fardata? ; сегмент дальних неинициализированных данных db 320*200+1 dup(?) ; содержит массив ячеек end start
Объяснение кода листинга программы
- Переменные:
- di (счетчик ячеек)
- ax (регистр AX используется для хранения случайного числа)
- dx (регистр DX используется для хранения текущего времени)
- si (счетчик ячеек для вывода на экран)
- cx (счетчик столбцов для вывода на экран)
- dx (счетчик строк для вывода на экран)
- al (регистр AL используется для хранения цвета точки)
- ah (регистр AH используется для хранения номера видеофункции)
- byte ptr [di] (смещение от di до ячейки в массиве для чтения/записи)
- byte ptr [di+1] (смещение от di+1 до ячейки в массиве для чтения)
- byte ptr [di-1] (смещение от di-1 до ячейки в массиве для чтения)
- byte ptr [di+319] (смещение от di+319 до ячейки в массиве для чтения)
- byte ptr [di-319] (смещение от di-319 до ячейки в массиве для чтения)
- byte ptr [di+320] (смещение от di+320 до ячейки в массиве для чтения)
- byte ptr [di-320] (смещение от di-320 до ячейки в массиве для чтения)
- byte ptr [di+321] (смещение от di+321 до ячейки в массиве для чтения)
- byte ptr [di-321] (смещение от di-321 до ячейки в массиве для чтения)
- Код выполняет следующие действия:
- Заполняет массив ячеек псевдослучайными значениями (живые ячейки - 01, пустые ячейки - 00).
- Переводит экран в графический режим 320x200, 256 цветов.
- Вычисляет число соседей для каждой ячейки и записывает его в старшие 4 бита ячейки.
- Изменяет состояние ячеек в соответствии с полученными значениями числа соседей.
- Выводит массив ячеек на экран средствами BIOS.
- Восстанавливает текстовый режим и завершает программу.
- Код использует следующие функции BIOS:
- INT 1Ah: получить текущее время (для получения значения DX).
- INT 10h: графический режим 320x200, 256 цветов (для переключения в графический режим).
- INT 10h: вывод точки на экран (для вывода ячеек на экран).
- INT 16h: проверить, не нажата ли клавиша (для ожидания нажатия клавиши).
- INT 21h: завершить программу (для завершения программы).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д