Графические устройства

         

Подпрограмма записи 24разрядного кода точки



Пример 7.1. Подпрограмма записи 24-разрядного кода точки

wrtpnt : push eax сохранение содержимого еах
mov es: [di] , al запись первого байта кода точки
shr eax, 08 сдвиг содержимого еах
cmp di, -2 сколько байтов до конца окна ?
jae wrtpnl -> 1 или 2 байта
mov es : [di+1] , ax запись остатка кода точки
pop eax восстановление содержимого еах
ret выход из подпрограммы
wrtpnl : push Cur win сохранение значения Cur win
je wrtpn2 -> до конца окна 2 байта
call NxtWinA установка следующего окна
mov es: [di+1] , ax запись остатка кода точки


jmp SHORT wrtpn3 переход на метку wrtpnS
wrtpn2 : mov es : [di+1] , al запись второго байта кода точки
call NxtWinA установка следующего окна
mov es: [di+2] , ah запись третьего байта кода точки
wrtpnS : pop Cur win восстановление значения Cur win
call SetWinA восстановление исходного окна
pop eax восстановление еах
ret выход из подпрограммы

Выполнение примера 7.1 начинается с сохранения в стеке кода точки, записи в видеопамять его младшего байта и сдвига содержимого регистра еах на 8 разрядов влево. После сдвига оставшиеся два байта кода точки находятся в регистре ах. Теперь надо проверить, сколько байтов осталось до конца окна, и выбрать способ записи остатка кода точки. Если оставалось больше двух байтов, то команда jae не выполняет переход на метку wrtpni. Последние два байта кода точки записываются в видеопамять, восстанавливается исходный код в регистре еах и происходит возврат из подпрограммы.

Если до конца окна оставалось 1 или 2 байта, то команда jae выполняет переход на метку wrtpni. На этой ветке подпрограммы сначала в стеке сохраняется значение переменной cur_win и вновь проверяется оставшееся количество байтов (команда push не изменяет состояние флагов).

Если до конца окна оставался 1 байт, то команда je не производит переход на метку wrtpn2 и выполняется следующая команда, устанавливающая новое окно видеопамяти. Затем в это окно записываются два оставшихся байта кода точки, и происходит безусловный переход на метку wrtpn3 для завершающих действий.

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

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



Содержание раздела