![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Тема: Графические видеорежимы. Работа с VGA-режимамиСодержание книги
Поиск на нашем сайте
Пример №1. Разработать программу, которая переводит экран в графический режим 13h (320x200) и заселяет его точками случайным образом, после чего эти точки эволюционируют согласно законам алгоритма «Жизнь»: если у точки меньше двух или больше трех соседей, она погибает, а если у пустой позиции есть три соседа, в ней появляется новая точка. masm model small .stack 100h .code .186
start: mov AX,@data mov DS,AX ; заполнение массива ячеек псевдослучайными значениями xor ax,ax int 1Ah; Функция АН = 0 INT 1Ah: получить текущее время DX теперь содержит ; число секунд, прошедших с момента включения компьютера, ; которое используется как начальное значение генератора случайных чисел 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; продолжить цикл, если DI не стал равен нулю
mov ax,0013h; графический режим 320x200, 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 – число соседей текущей ; ячейки 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; номер видеофункции в АН int 10h; вывести точку на экран dec si; следующая ячейка dec cx; следующий номер столбца jns zdisplay; если столбцы не закончились - продолжить, mov cx,319; иначе: снова максимальный номер столбца в СХ 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
Задание для самостоятельной работы: Разработать программу, которая переводит экран в графический режим 13h (320x200) и заселяет его точками случайным образом, после чего эти точки эволюционируют согласно законам алгоритма «Жизнь»: если у точки меньше двух или больше трех соседей, она погибает, а если у пустой позиции есть три соседа, в ней появляется новая точка. При этом, так как для хранения информации о каждой ячейке используется один байт, то осуществить вывод данных на экран в режиме 13h, выполнив простое копирование.
;Изобразить в правом верхнем углу экрана окно с синим крестом на белом фоне. ;По нажатию клавиши F1 последовательно копировать его в левое верхнее,левое ;нижнее и правое нижнее окно экрана.По клавише Е все стирать, по клавише R на- ;чинать заново(использовать режим 1 видео-вывода)
model small .stack 100h .data ;------------------------------------- color db 7 color1 db 1 flag db 0 er db 0 ;------------------------------------- ports macro prt,nreg,val; mov dx,prt mov al,nreg out dx,al
inc dx
mov al,val out dx,al endm ;-------------------------------------- .code Start: mov ax,@data mov ds,ax
mov ax,0a000h;Для графического режима mov es,ax
mov AH,0;Режим 640Х480 MOV AL,12H; INT 10H; main: call draw mov ah,00h;Чтение символа с ожиданием int 16h cmp al,1bh;ESC-Exit jne m0 cmp ah,01h je exit m0: cmp ah,3bh;F1-Copy jne m1 add flag,1;изменение содержимого флага на 1 call fcopy m1: cmp al,45H;E-ERASE jne m2 call erase mov er,1;установка флага в 1 m2: cmp al,52H;R-Restart jne m3 mov flag,0;обнуление флагов mov er,0; m3: jmp main exit: mov ax,4c00h int 21h ;-------------------Очистка экрана-------------------------------- erase proc mov bx,0 xor si,si mov cx,480*80
beg1: ports 3c4h,2,0fh ports 3ceh,8,0ffh mov byte ptr es:[bx][si],0 inc si cmp si,80 jb lp add bx,80 xor si,si lp: loop beg1 ret erase endp ;----------------------Быстрое копирование-------------------------- fcopy proc ;----------------------------------------------------------- cmp flag,1;Левое верхнее положение jne k1 mov bp,0;координата jmp kop ;----------------------------------------------------------- k1: cmp flag,2;Левое нижнее положение jne k2 mov bp,420*80;координата jmp kop ;----------------------------------------------------------- k2: cmp flag,3;Правое нижнее положение je kop1 ret kop1: mov bp,420*80+64;координата kop: ports 3ceh,5,1;установка режима быстрого копирования(1 режим) mov bx,64;установка начальной координаты копируемого обьекта mov cx,60*16;16 байт длина Х 60 пикселей beg3: mov al,es:[bx][si] mov es:[bp][si],al inc si cmp si,16 jb lp3 xor si,si add bx,80 add bp,80 lp3: loop beg3 ports 3ceh,5,2;установка режима быстрого закрашивания(2 режим) необходимо для выполнения процедуры draw ret fcopy endp draw Proc cmp er,1;Если была нажата кнопка E - очистка,то ничего не рисовать, сразу выход из процедуры jne mt1 ret mt1: cmp flag,0;Если не было нажато клавиши F1,то прорисовка;картинки в правом верхнем углу экрана je mt2 ret mt2: mov bx,64 xor si,si mov cx,60*16 ports 3c4h,2,0fh ports 3ceh,8,0ffh mov byte ptr es:[bx][si],0 begin: ;--------Синия вертикальная полоска------------ cmp si,8;сравниваем с серединой белого флага по горизонтали jne met1 ports 3c4h,2,color1 mov byte ptr es:[bx][si],0ffh inc si jmp lp1 ;--------Синия горизонтальная полоска---------- met1: cmp bx,64+80*25;сравниваем с серединой белого флага по;вертикали jne met2 push cx mov cx,8*16
beg: ports 3c4h,2,color1 mov byte ptr es:[bx][si],0ffh inc si cmp si,16 jb lp2 add bx,80 xor si,si lp2: loop beg pop cx sub cx,8*16 met2:;---------Белый фон---------------------------- ports 3c4h,2,color mov byte ptr es:[bx][si],0ffh inc si cmp si,16 jb lp1 add bx,80 xor si,si lp1: loop begin ret draw endp end Start Вариант 2 ;Вариант №6. Изобразить на экране синюю решетку толщиной 2 пикселя. ;По нажатию клавиши ALT/E последовательно менять фон за решеткой по ;правилу белый-желтый-красный.
.model small .stack 100h .data ;------------------------------------- shag dw 0 color db 1 cvet db 8
;------------------------------------- ports macro prt,nreg,val; mov dx,prt mov al,nreg out dx,al
inc dx
mov al,val out dx,al endm ;--------------------------------------
.code Start: mov ax,@data mov ds,ax
mov ax,0a000h;Для графического режима mov es,ax
mov AH,0 MOV AL,12H INT 10H
main: call draw mov ah,00h int 16h
cmp al,1bh je exit cmp ah,12h je fon1
jmp main
fon1: call fon
jmp main
exit: mov ax,4c00h int 21h ;-------------------------------------------------------------- fon proc ;-------------FON-------------------------------------- cmp cvet,6 jne p2 dec cvet p2: cmp cvet,4 jne p1 mov cvet,8 p1: dec cvet
mov AH, 10h mov AL, 0 mov BL, 0; nomer cvetovogo registra. 0 - cvet fona mov BH, cvet; RGB kod zanosimyj v cvetovoj registr int 10h
ret fon endp ;-------------------------------------------------------------- draw Proc ;-------------RESHETKA---------------------------------
mov bx,0 mov shag,80*5 xor si,si mov cx,480*80
ports 3c4h,2,0fh ports 3ceh,8,0ffh mov byte ptr es:[bx][si],0
ports 3c4h,2,color
begin: cmp bx,shag jne met1 add shag,80*7 ;----------Gorizontalinie linii---------- push cx mov cx,80*2 beg: mov byte ptr es:[bx][si],0ffh
inc si cmp si,80
jb lp add bx,80 xor si,si lp: loop beg pop cx sub cx,2
jmp begin
;-----------Vertikalinii linii----------- met1: mov byte ptr es:[bx][si],081h
inc si cmp si,80
jb lp1 add bx,80 xor si,si lp1: loop begin ;-------------------------------------------- ret
draw endp ;----------------------------------------------------
end Start
Лабораторная работа № 8. Тема: Работа с файлами Пример №1. Создание файла и запись в него данных ;В сегменте команд ;Создадим файл mov АН,3Ch; Функция создания файла mov CX, 0; Без атрибутов mov DX, offset fname; Адрес имени файла int 21h mov handle,AX; Сохраним дескриптор файла ; Запишем в файл данные (в данном примере - текстовую строку) mov AH,40h; Функция записи в файл mov BX,handle; Дескриптор mov CX,buflen; Число записываемых байтов mov DX,offset bufout; Адрес данных
int 21h ; Закроем файл (нет необходимости) mov АН,3Eh; Функция закрытия файла mov BX,handle; Дескриптор int 2lh ; В сегменте данных bufout db 'Файл номер 1'; Данные для записи в файл buflen=$-bufout; Ee длина (12 байт) handle dw 0; Ячейка для дескриптора fname db 'MYFILE.001',0;Имя файла в формате ASCIIZ
Пример №2. Прямой доступ к файлу. Модифицируем созданный ранее файл в примере 1 MYFILE.txt, содержащий строку “Файл номер 1”, в которой следует заменить 1 на 2а. ; В сегменте команд ; Откроем файл mov AH,3Dh;Функция открытия файла mov AL,2;Доступ для чтения-записи mov DX,offset fname;Адрес имени файла int 21h mov handle,AX;Сохраним дескриптор ;Установим указатель на байт номер 11 mov AH,42h;Функция установки указателя mov AL,0;Режим - от начала файла mov BX,handle;Дескриптор mov CX, 0;Старшая половина указателя mov DX, 11;Младшая половина указателя int 21h ;Модифицируем файл mov AH,40h;Функция записи mov BX,handle;Дескриптор mov CX,2;Число записываемых байтов mov DX,offset mod;Отсюда выводить int 21h ;В сегменте данных mod db '2a';Буфер вывода handle dw 0;Ячейка для дескриптора fname db 'MYFILE.txt', 0;Имя файла в формате ASCIIZ
Пример №3. Чтение файла ;В сегменте команд ;Откроем файл mov AH,3Dh; Функция открытия файла mov AL,2; Доступ для чтения-записи mov DX,offset fname; Адрес имени файла int 21h mov handle,AX; Сохраним дескриптор ; Поставим запрос на чтение 80 байт mov AH,3Fh; Функция чтения mov BX,handle; Дескриптор mov cx,80; сколько читать mov DX,offset bufin; СЮда int 21h mov CX,AX; Сколько реально прочитали ; Выведем прочитанное на экран mov AH,40h; Функция записи mov 3X,1; Дескриптор стандартного вывода mov DX,offset bufin; Отсюда выводить (СХ байт) int 21h ; В сегменте данных bufin db 80 dup (' '); Буфер ввода handle dw 0; Ячейка для дескриптора fname db 'MYFILE.001',0; Имя файла в формате ASCIIZ
Пример №4. Назначение файлу даты и времени создания ;В сегменте команд ;Откроем файл mov AH,3Dh; Функция открытия файла mov AL,2 mov DX,offset fname; Адрес имени файла int 21h mov handle,ax; Получили дескриптор ; Изменим дату и время создания ;Изменим дату и время создания файла mov ah,57h; Функция даты/времени mov al,1; Установить дату/время mov bx,handle; Дескриптор файла mov сх.,0; очистим Сх or cx,sec; добавим секунды or cx,min; добавим минуты or cx,hour;добавим часы xor dx,dx; очистим dx or dx,day; добавим день or dx,month;добавим месяц or dx,year; добавим год int 21h ;В сегменте данных handle dw 0; ячейка для дескриптора fname db ‘MYFILE.TXT’,0; имя файла sec dw 6/2; 6 секунд min dw 15*32; 15 минут hour dw 12*2048; 12 часов day dw 10; 10 число month dw 3*32; март year dw 21*512 21 год от 1980, то есть 2001 г.
Задание для самостоятельной работы: Разработать программу для создания файла и записи в него своих данных. При этом, программа должна предусмотреть случай, когда нужно будет поменять данные в созданном файле по требованию пользователя.
Лабораторная работа №5. Тема: Работа с массивами
|
||||||||
Последнее изменение этой страницы: 2016-09-13; просмотров: 293; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.77.149 (0.011 с.) |