Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 283; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.200.56 (0.007 с.) |