- •Общая часть
- •История появления ассамблера
- •Получение исполняемого файла
- •Регистры модели x86.
- •Организация цикла
- •Условный и безусловный переход
- •Особенности работы с графикой
- •2.2.2 Листинг программы №2
- •2.2 Постановка задачи №2
- •2.2.1 Выходные данные программы №2
- •2.3 Постановка задачи №3
- •2.3.1 Выходные данные программы №3
- •2.3.2 Листинг программы №3
- •2.4 Постановка задачи №4
- •2.4.1 Выходная форма программы №4
- •2.4.2 Листинг программы №4
Особенности работы с графикой
Для отображения несложной графики используется GDI (graphics device interface). Особенности GDI - простота использования и низкая скорость, что делает его пригодным, в основном, для создания нестандартных элементов интерфейса и приложений со "слабой" графикой.
Для создания изображений часто применяются команды FPU и SIMD инструкции (MMX;XMM;3DNow!), поэтому изложенные материалы о GDI будут использоваться в следующих главах для наглядного изучения дополнительных инструкций процессора.
Основное понятие GDI - это Device Context -DC. - Представляет из себя набор свойств среды рисования: изображение, используемые шрифты, цвета и т.д.
Для того, чтобы добавить/заменить в DC какой-либо элемент, нужно создать его, а после использовать функцию SelectObject. Рисование производится на объекте типа Bitmap.
Цвета, передаваемые функциям GDI - RGB: байт #0 определяет уровень красного цвета, #1 - зеленого, #2 - синего, и #3=0
Чаще всего GDI используется для отображения графики в окне.
При необходимости обновить часть изображения окна, Windows добавляет этот регион в т.н Update Region и, позже, посылает сообщение WM_PAINT. Обработчик сообщения обычно вызывает функцию BeginPaint, возвращающую хэндл DC клиент - части окна, с установленным clipping region'ом равным update region'у. Т.е рисование будет происходить только в части окна, необходимой для обновления. Это сделано для избежание мерцания при рисовании. Далее Update Region очищается и следующее сообщение WM_PAINT произойдет только при следующей необходимости прорисовки изображения. В случае надобности перерисовки всего клиент - содержимого окна кроме WM_PAINT посылается также WM_ERASEBKGND, а для обновления не клиент - части - WM_NCPAINT.
Для добавления части/всего окна в update region используются функции InvalidateRect/ InvalidateRgn. Автоматическое добавление происходит при смене размера окна, удаления перекрытия другими окнами и т.д.
Можно получить DC окна функциями GetDC, GetWindowDC, и вывести изображение, но при появлении update region'а оно будет не действительным. Эти ф-ции не влияют и не зависят от Update Region'а
Некоторые свойства GDI зависят от стиля окна, стиля класса, хэндла кисти фона класса. Для избежание мигания изображения кисть фона обычно устанавливается в ноль при регистрации класса.
Можно создать DC, существующее только в памяти и не отображаемое на экране - Memory DC, вызвав функцию CreateCompatibleDC. Memory DC чаще всего используется для:
• Избежание мерцания (Flicker) изображения при прорисовке.
Мерцание происходит если пользователь видит процесс создания изображения, при прорисовке перекрывающихся элементов т.к графика, выводимая в DC окна, сразу же отображается. Для устранения мерцания можно использовать объекты типа Region, но чаще создается DC в памяти, на котором происходит рисование, а по завершению процесса создания изображения производится копирование из Memory DC в DC окна (обычно функцией BitBlt).
Объект Bitmap в таких случаях можно создать ф-цией CreateCompatibleBitmap
• Рисование изображения для последующих манипуляций с данными изображения. В таком случае объект Bitmap обычно создается функцией CreateDIBSection что позволяет иметь непосредственный доступ (чтение/запись) к массиву точек изображения. Функции рисования в DC также влияют на массив точек изображения в памяти. Такое изображение можно легко сохранить в .bmp файл, записав сначала структуру BITMAPFILEHEADER, за ней BITMAPINFOHEADER, далее палитру (если есть), и массив точек изображения (с выравниванием строк на dword)
2 СПЕЦИАЛЬНАЯ ЧАСТЬ
2.1 Постановка задачи №1
Нарисовать 2 треугольника разных цветов .
2.1.1 Выходные данные программы №1
2.1.2 Листинг программы №1
Dosseg ; Директива задает
;Расположение сегментов в памяти
.model small ;директива описание модели памяти
.stack 100h ;директива определяет размерность стека
.code ;директива,отмечаю начало
;расположение информации в сегменте
;Кода.
mov ah,06h ;Функция установки окна на экране.
mov bh,70h ;цвет окна и символа
mov ch,0 ;левая врехняя координата y
mov cl,0 ;левая верхняя координата x
mov dh,4 ;правая нижняя координата y
mov dl,79 ;правая нижняя координата x
int 10h ;прерывания,по которому управлению
;передается BIOS для выполнения
;вышеназванной функции.
xor ax,ax ;обнуление регистра ах
mov ah,06h ;Функция установки окна на экране.
mov bh,90h ;цвет окна и символа
mov ch,4 ;левая врехняя координата y
mov cl,0 ;левая верхняя координата x
mov dh,8 ;правая нижняя координата y
mov dl,79 ;правая нижняя координата x
int 10h ;прерывания,по которому управлению
xor ax,ax ;обнуление регистра ах
mov ah,06h ;Функция установки окна на экране.
mov bh,60h ;цвет окна и символа
mov ch,8 ;левая врехняя координата y
mov cl,0 ;левая верхняя координата x
mov dh,12 ;правая нижняя координата y
mov dl,79 ;правая нижняя координата x
int 10h ;прерывания,по которому управлению
xor ax,ax ;обнуление регистра ах
mov ah,06h ;Функция установки окна на экране.
mov bh,40h ;цвет окна и символа
mov ch,12 ;левая врехняя координата y
mov cl,0 ;левая верхняя координата x
mov dh,16 ;правая нижняя координата y
mov dl,79 ;правая нижняя координата x
int 10h ;прерывания,по которому управлению
xor ax,ax ;обнуление регистра ах
mov ah,06h ;Функция установки окна на экране.
mov bh,30h ;цвет окна и символа
mov ch,16 ;левая верхняя координата y
mov cl,0 ;левая верхняя координата х
mov dh,22 ;правая нижняя координата y
mov dl,79 ;правая нижняя координата x
int 10h ;прерывания, по которому управлению
xor ax,ax ;обнуление регистра ах
mov ah,06h ;Функция установки окна на экране.
mov bh,10h ;цвет окна и символа
mov ch,22 ;левая врехняя координата y
mov cl,0 ;левая врехняя координата x
mov dh,26 ;правая нижняя координата y
mov dl,79 ;правая нижняя координата x
int 10h ;прерывания, по которому управлению
xor ax,ax ;обнуление регистра ах
mov ah,06h ;Функция установки окна на экране
mov bh,24 ;цвет окна и символа
mov ch,22 ;левая верхняя координата y
mov cl,0 ;левая верхняя координата x
mov dh,32 ;правая нижняя координата y
mov dl,79 ;правая нижняя координата x
int 10h ;прерывания, по которому управлению
mov ah,01h ;приостановка программы до нажатия любой
int 21h ;клавиши
mov ah,4ch ;функция ДОС завершения программы.
int 21h ;прерывания по которому происходит
;передача управления ОС для выполнения
; ранее объявленной функции.
end ;директива завершения программы на ассемблер
