Игра "Жизнь" - Assembler
Формулировка задачи:
Написал код по книге. Запускаю в Dosbox, а в результате просто чёрный экран. Почему?
Вот код:
; lifebios.asm ; Игра "Жизнь" на поле 320х200, используя вывод на экрна стредствами BIOS. .model small .stack 100h ; Явное задание стека - для EXE-программ. .code .186 ; Для команд shl, al,4 и shr al,4. 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 ; Графический режим 320х200, 256 цветов. int 10h ; Основной цикл. new_cycle: ; Шаг 1: для каждой ячейки вычисляется число соседей ; и записывается в старшие 4 бита этой ячейки. 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 - число ; соседей текущей ячейки. 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,0003h ; Восстановить текстовый режим int 10h mov ax,4C00h ; и завершить программу. int 21h .fardata? ; Сегмент дальних неинициализированных данных db 320*200+1 dup(?) ; содержит массив ячеек. end start
Решение задачи: «Игра "Жизнь"»
textual
Листинг программы
or byte ptr [di],al
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д