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

         

Преобразование палитры rgb в 32разрядный код



Пример 7.20. Преобразование палитры rgb в 32-разрядный код

cnvpal: PushReg <ax,ex,di,si,es> ; сохранение содержимого регистров
les di, dword ptr GenOffs; es:di = адрес таблицы цветов
modcol: xor ah, ah очистка регистра ah
lods byte ptr f s:[si] чтение кода красного цвета
shl eax, 16 сдвиг содержимого еах влево на слово
lods word ptr fs:[si] чтение зеленого и синего цвета
xchg ah, al перестановка синего и зеленого цвета
stosd запись строки в таблицу цветов
loop modcol управление повторами цикла
PopReg <es,di,cx,ax> восстановление регистров
ret возврат из подпрограммы

Выполнение цикла modcol в примере 7.20 начинается с очистки регистра ah. В результате, после сдвига на 16 разрядов, окажется очищенным резервный байт в формируемом коде цвета. Вторая команда тела цикла считывает в регистр ai код красного цвета, и в регистре ах оказывается старшая часть формируемого кода.

Она сдвигается на 16 разрядов и оказывается в старшей половине регистра еах, а в младшую считываются коды зеленого и синего цветов. Для того чтобы содержимое регистра еах соответствовало табл. 7.2, эти цвета надо поменять местами, что и делает команда xchg. Сформированный код записывает в таблицу цветов команда stosd. Для чтения и записи в цикле использованы строковые операции, поэтому команды переадресации не нужны. Сразу после stosd выполняется команда loop, управляющая повторами цикла.

 


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