Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция№8-11(Массивы-структуры).doc
Скачиваний:
5
Добавлен:
23.11.2018
Размер:
1.52 Mб
Скачать

3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:

BOOL GetFileInformationByHandle(HANDLE hFile,

LPBY_HANDLE_FILE_INFORMATION lpFileInformation);

На вход данной функции передается дескриптор файла, о котором необходимо получить информацию, и указатель на экземпляр структуры BY_HANDLE_FILE_INFORMATION, который заполняется этой функцией. В этой структуре сосредоточена вся информация о файле.

Пример 10: Разработать Win32 - консольное приложение с использованием функции GetFileInformationByHandle.

;---------------------------описание структур----------------------------

FILETIME struc

DwLowDateTime dd ? ;младшие 32 бита значения времени

DwHighDateTime dd ? ;старшие 32 бита значения времени

FILETIME ends

BY_HANDLE_FILE_INFORMATION struc

DwFileAttributes dd 0 ;атрибуты файла

struc

ftCreationTime_DwLowDateTime dd ? ; младшие 32 бита времени

; создания файла

ftCreationTimeDwHighDateTime dd ? ;старшие 32 бита времени создания

; файла

Ends

Struc

FtLastAccessTime_DwLowDateTime dd ? ; младшие 32 бита времени

; последнего доступа

FtLastAccessTime_DwHighDateTime dd ? ; старшие 32 бита времени

; последнего доступа

еnds

struc

ftLastWriteTime_DwLowDateTime dd ? ; младшие 32 бита времени

; последней записи

ftLastWnteTime_DwHighDateTime dd ? ;старшие 32 бита времени

; последней записи

ends

dwVolumeSerialNumber dd 0 ;серийный номер тома, на котором

; находится файл

nFileSizeHigh dd 0 ; старшие 32 бита размера файла

nFileSizeLow dd 0 ; младшие 32 бита размера файла

nNumberOfLinks dd 0 ; число ссылок на файл

nFileIndexHigh dd 0 ;старшие 32 бита идентификатора файла

nFileIndexLow dd 0 ; младшие 32 бита идентификатора файла

ends

.data

info BY_HANDLE_FILE_INFORMATION <>

TitleText db 'Получение информации о файле в Win32',0

lpBuf db "File1.txt",0

hFile dd 0

.code

;-------------------------------------Открываем файл--------------------

push 0

push 0

push OPEN_EXISTING ; открыть существующий файл, если его нет –

; ошибка

push 0 ; защита файла не требуется

push FILE_SHARE_READ ;разрешено совместное использование файла

; (по чтению)

push GENERIC_READ ; разрешено чтение из файла

push offset lpBuf

call CreateFileA

сmp eax,0ffffffffh

je exit ; если неуспех

mov hFile,eax ; дескриптор файла

;---------------------------GetFileInformationByHandle

push offset info

push hFile

call GetFileInformationByHandle

cmp eax,0

jz exit ; выход в случае неудачи

; результат смотрим в отладчике TD32.exe

Самостоятельно на практике: Вывести все атрибуты созданного текстового файла File1.txt на консоль.

Лекция №11. Работа с графикой на ассемблере. Функции BIOS. Видеопамять.

Современные видеоконтроллеры поддерживают разнообразные текстовые и графические режимы. Текстовые режимы различаются по разрешению (число отображаемых символов по горизонтали и вертикали) и цветовой палитре (монохромный или 16-цветный режим). Для графических режимов основным признаком классификации является количество одновременно отображаемых цветов и, соответственно, количество бит видеопамяти, отводимое на каждую точку (пиксел) изображения.

Различают следующие типы графических режимов:

монохромный (1-битное кодирование);

16-цветный EGA/VGA (4-битное кодирование);

256-цветный SVGA (8-битное кодирование);

HiColor (16-битное кодирование);

TrueColor (24-битное / 32-битное кодирование).

Для работы с графическим адаптером, в BIOS используется прерывание INT 10h. Оно позволяет устанавливать графические режимы работы, выводить символы и графику. Выбор графического режима – Функция 0 (ah=0) прерывания INT 10h устанавливает видеорежим, который был указан в регистре AL.

Графические режимы

Режим

Разрешение

Количество цветов

06h

640x200

2

0Dh

320x200

16

0Eh

640x200

16

0Fh

640x350

2

10h

640x350

16

11h

640x480

2

12h

640x480

16

13h

320x200

256

6Ah *

800x600

16

Режим 6Ah утвержден VESA, но его поддерживают не все видео адаптеры

Существуют также дополнительные режимы, которые используются для SVGA и XGA адаптеров. Они устанавливаются вызовом VESA BIOS Extension (AX=4F02h INT 10h).

Рисование точки

Функция 0Ch прерывания INT 10h.

Цвет – в AL;

Видеостраница – в BH;

КоординатаY – в DX;

КоординатаX – в CX.

Пример: нарисовать точку с цветом 1, с координатами X=50 и Y=20.

mov ah,0Ch ; функция рисования точки

mov al,1 ; цвет точки

mov bh,0 ; видео страница

mov cx,50 ; координата X

mov dx,20 ; координата Y

int 10h ; вызов прерывания BIOS

Функция 0Ch исполняется очень медленно, особенно при рисовании множества точек. Настоящие графические программы (такие как игры) записывают непосредственно в видеопамять, после того, как они рассчитали цвет и расположение точки.

Пример программы

Эта программа переключается в графический режим, рисует длинную линию, используя функцию 0Сh, затем ожидает нажатия клавиши и возвращается в прежний режим.

.model small

.stack 100h

.386

Mode_6 = 6 ; 640 X 200, 2 colors

Mode_13 = 0Dh ; 320 X 200, 16 colors

Mode_14 = 0Eh ; 640 X 200, 16 colors

Mode_15 = 0Fh ; 640 X 350, 2 colors

Mode_16 = 10h ; 640 X 350, 16 colors

Mode_17 = 11h ; 640 X 480, 2 colors

Mode_18 = 12h ; 640 X 480, 16 colors

Mode_19 = 13h ; 320 X 200, 256 colors

Mode_6A = 6Ah ; 800 X 600, 16 colors

.data

saveMode db ; Сохранить текущий видео режим

currentX dw 100 ; координата X

currentY dw 100 ; координата Y

color db 1 ; номер цвета

; В 2 цветном режиме 1 = белый, в 16 цветном 1 = синий

.code

start:

mov ax,@data

mov ds,ax

; Получить текущий видеорежим

mov ah,0Fh

int 10h

mov saveMode,al

; Переключиться в графический режим

mov ah,0 ; установка видеорежима

mov al,Mode_17 ; номер режима

int 10h

; Рисование прямой линии

LineLength = 100

mov dx,currentY

mov cx,LineLength ; счетчик цикла

L1:

push cx

mov ah,0Ch ; рисование точки

mov al,color ; цвет точки

mov bh,0 ; видео страница

mov cx,currentX

int 10h

inc currentX

;inc color ; используйте для разноцветной линии

pop cx

loop L1

; Ожидаем нажатия клавиши

mov ah,0

int 16h

; Возврат в прежний видеорежим

mov ah,0 ; установить видео режим

mov al,saveMode ; сохраненный видео режим

int 10h

; Выход из программы

mov ax,4C00h

int 21h

end start

Обзор прерываний BIOS

Получение информации об оборудовании

INT 11h - Получить список оборудования.

В процессе инициализации тестовые модули, находящиеся в BIOS, динамически определяют состав аппаратного обеспечения машины и записывают конфигурацию системы в специально отведенную для этого ячейку памяти.

С помощью прерывания INT 11h, получают в регистре AX состав аппаратного обеспечения машины. Каждый бит в слове конфигурации отвечает за соответствующее устройство.

Значения битов в регистре AX:

Биты Значение

0 1 - система содержит НМД;

0 - система не содержит НМД.

1 1 - установлен арифметический сопроцессор;

0 - арифметический сопроцессор не установлен.

2-3 Объем основной памяти, установленной на материнской плате:

Биты: 3 2

0 1 - 16К;

1 0 - 32К;

1 1 - 64К и более.

4-5 Тип дисплейного контроллера и его режим:

Биты: 5 4

0 0 - не используется или EGA;

0 1 - CGA, EGA, VGA в режиме 40x25;

1 0 - CGA, EGA, VGA в режиме 80x25;

1 1 - монохромный контроллер.

6-7 Количество установленных НГМД:

Биты: 7 6

0 0 - установлен 1 НГМД;

0 1 - установлено 2 НГМД;

1 0 - установлено 3 НГМД;

1 1 - установлено 4 НГМД.

8 1 - используется контроллер прямого доступа к памяти;

0 - контроллер прямого доступа к памяти не используется.

9-11 Количество установленных портов последовательной передачи данных RS232S:

000 - нет портов;

001 - используется один порт;

.............

111 - используется 7 портов.

12 1 - используется игровой адаптер (джойстик);

0 - игровой адаптер не используется.

13 1 - установлен последовательный принтер (только для PC Jr).

14-15 Количество установленных принтеров:

00 - нет принтеров;

01 - используется 1 принтер;

10 - используется 2 принтера;

11 - используется 3 принтера.

INT 12h - Получить размер основной памяти.

Прерывание INT 12h возвращает в регистре AX количество имеющихся блоков памяти размером в один килобайт.

Если компьютер оборудован расширенной памятью (адресное пространство этой памяти находится выше границы в 1 мегабайт), то размер этой памяти в килобайтах можно узнать, вызвав прерывание INT 15h со значением регистра AX, равным 8800h.

Возвращает в регистре AX размер памяти в килобайтах.

Работа с дисплейным адаптером.

При вызове прерывания INT 10h регистр AH должен содержать номер функции, которую требуется выполнить. Остальные регистры при вызове прерывания содержат операнды. Приведем краткий обзор функций прерывания INT 10h.

00h - Задание видеорежима.

В процессе инициализации BIOS задает начальный режим адаптера исходя из его типа. Если нужен другой режим, отличный от исходного, то необходимо использовать функцию 00h.

При этом необходимо учитывать, что дисплейные адаптеры могут поддерживать не все режимы.

При вызове:

AH=00h

АL=видеорежим: