Создать программу, которая переводит экран в графический режим - 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

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

  1. Переменные:
    • 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 до ячейки в массиве для чтения)
  2. Код выполняет следующие действия:
    • Заполняет массив ячеек псевдослучайными значениями (живые ячейки - 01, пустые ячейки - 00).
    • Переводит экран в графический режим 320x200, 256 цветов.
    • Вычисляет число соседей для каждой ячейки и записывает его в старшие 4 бита ячейки.
    • Изменяет состояние ячеек в соответствии с полученными значениями числа соседей.
    • Выводит массив ячеек на экран средствами BIOS.
    • Восстанавливает текстовый режим и завершает программу.
  3. Код использует следующие функции BIOS:
    • INT 1Ah: получить текущее время (для получения значения DX).
    • INT 10h: графический режим 320x200, 256 цветов (для переключения в графический режим).
    • INT 10h: вывод точки на экран (для вывода ячеек на экран).
    • INT 16h: проверить, не нажата ли клавиша (для ожидания нажатия клавиши).
    • INT 21h: завершить программу (для завершения программы).

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


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

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

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