- •4) Mov esi,6*2 ; 2 байта – размер элементов
- •Индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
- •Базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
- •Xor ecx,ecx ;обнуление есx
- •Структуры
- •Организовать обращение к элементам структуры.
- •Цепочечные команды или команды обработки строк символов
- •Организация обращения к элементам записи.
- •Работа с записями
- •1) Для выделения элемента записи необходимо:
- •2) Чтобы поместить измененный элемент на его место в запись необходимо:
- •3. В конце работы файл следует закрыть.
- •4. Признаком ошибки при выполнении функции dos является взведенный флаг с (переноса).
- •2. Создание файла с усечением существующего до нулевой длины.
- •LpFileName — указатель на asciiz-строку с именем (путем) открываемого или создаваемого файла;
- •DwDesiredAccess — тип доступа к файлу:
- •3) Создать и открыть новый файл
- •4) Чтение из файла или устройства
- •5) Переместить указатель чтения/записи
- •1) HFile – хэндл того файла, в котором перемещается указатель.
- •7) Запись в файл или устройство
- •8) Закрыть файл
- •9) Удаление файла
- •Функция 01h – ожидание ввода символа с эхопечатью
- •Функция 0ah – получение строки символов
- •1) Создать каталог
- •2) Удалить каталог
- •5) Определить текущий каталог
- •Перечень функций прерывания 21h, работающих с файлами, которые имеют длинные имена и соответствующие функции api Win32.
- •Перечислим функции api Win32, имеющие отношение к работе с файловой системой.
- •1) В Win32 получить время создания, время последнего доступа и время последней модификации файла можно с помощью функции GetFileTime.
- •3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:
- •Основные графические режимы vga
- •Int 10h ; считываем символ и его атрибут
- •Стандартные цветовые палитры в режимах 4,5,6.
- •02H/03h - Чтение/запись секторов.
- •Прямое программирование видеобуфера в текстовом режиме
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=видеорежим: