Игра "Жизнь" - 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

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


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

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

5   голосов , оценка 3.6 из 5