
- •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, с помощью которой можно получить все атрибуты файла:
- •Обзор прерываний bios
- •Int 10h, функция 0Dh. Чтение пиксела.
- •02H/03h - Чтение/запись секторов.
- •Прямое программирование видеобуфера в текстовом режиме
- •Текстовый режим. Доступ к памяти
- •Организация памяти в графическом режиме 12h
- •Вычисление адреса Пикселя по экранным координатам.
- •Рисование с помощью регистров Графического Контроллера
- •Установка цвета отдельных пикселей.
- •Прокрутка областей экрана, копирование областей экрана.
- •Чтение отдельных пикселей с экрана.
- •Рисование с помощью регистров Указателя Последовательности
- •Установка цвета ячейки пикселей.
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. Работа с графикой на ассемблере
"У меня есть пример, который должен работать с текстовым экраном. Но он не работает под Windows XP. Как это исправить?"
Ответ:
Действительно, может показаться, что ни одна программа для DOS, использующая прямой вывод в видеопамять (по адресам 0B800h:0000h) не работает под Windows XP (хотя нормально работает под Windows 98), т.к. на экране ничего не появляется. Но на самом деле это не так.
Все консольные приложения Windows работают в текстовом режиме, но это не одно и то же, что и текстовый режим, в котором работала DOS. Консоль в Windows не имеет прямой связи с видеопамятью, т.к. обычно Windows работает в графическом режиме, в то время как консоль представляет собой текстовое устройство, да и размеры консоли вовсе не ограничиваются текстовыми режимами, которые поддерживает видеокарта. Вы можете задать произвольные размеры консоли (в символах) в свойствах ярлыка программы (закладка "Расположение").
При этом, когда в окне консоли запускается DOS задача, эмуляция видеопамяти по адресам 0B800h:0000h не настроена. И изменение оперативной памяти в этом блоке не приводит к изменению состояния буфера консоли. Не поможет в этом случае и переход в полноэкранный режим.
Но решение этой проблемы существует, и оно достаточно простое. Если Ваша программа намеревается работать напрямую с видеопамятью, просто добавьте в ее начало следующие строчки кода:
mov ax, 3
int 10h
Эта функция установит обычный текстовый режим 80х25 для программы и одновременно ... настроит эмуляцию участка памяти 0B800h:0000h в буфер консоли. Программа при этом будет работать правильно (как в оригинальной DOS) как в оконном, так и в полноэкранном режиме. И при это не стоит слушать людей, которые утверждают, что ХР не разрешает работать напрямую с буфером видеопамяти по адресам 0B800h:0000h!
Современные видеоконтроллеры поддерживают разнообразные текстовые и графические режимы. Текстовые режимы различаются по разрешению (число отображаемых символов по горизонтали и вертикали) и цветовой палитре (монохромный или 16-цветный режим). Для графических режимов основным признаком классификации является количество одновременно отображаемых цветов и, соответственно, количество бит видеопамяти, отводимое на каждую точку (пиксел) изображения. Различают следующие типы графических режимов:
– монохромный (1-битное кодирование);
– 16-цветный EGA/VGA (4-битное кодирование);
– 256-цветный SVGA (8-битное кодирование);
– HiColor (16-битное кодирование);
– TrueColor (24-битное / 32-битное кодирование).
Графические режимы VGA (SVGA) сильно устарели, а текстовые продолжают успешно применяться.
Для работы с графическим адаптером, в 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 исполняется очень медленно, особенно при рисовании множества точек. Настоящие графические программы (такие как игры) записывают непосредственно в видеопамять, после того, как они рассчитали цвет и расположение точки. Но в нашем случае INT 10h является промежуточным шагом на пути к настоящему программированию графики (прямой вывод графики в видео режиме 13h (320x200x256)).
Пример программы
Эта программа переключается в графический режим, рисует длинную линию, используя функцию 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
main proc
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
main endp
end main