cnvpal: PushReg < ax,b x, ex, di , si,es>; сохранение содержимого регистров
les di, dwo :d ptr ( 5enOffs; es:di = адрес таблицы цветов
modcol : mov al, fs: [si+2] читаем код красного цвета в al
shr al, 03 сокращаем его до 5-ти разрядов
mov bh, fs: [si+1] читаем код зеленого цвета в bh
shld ax, bx, 05 ! ! или shld ax, bx, 06
mov bh, fs: [si] читаем код синего цвета в bh
shld ax, bx, 05 сдвигаем и дополняем код в ах
add si, 03 ! ! для формата "bgrO" — add si, 04
stosw записываем новый код цвета
loop modcol управление повторами цикла
PopReg <es,si ,di, ex, зх,ах> ; восстановление регистров
ret возврат из подпрограммы
Если вы сравните тексты примеров 7.17 и 7.18, то обнаружите, что в них различаются только индексные выражения у первой и третьей команд пересылки. За счет такого трюка мы считывает базовые цвета в том порядке, в котором они должны располагаться в формируемом коде.
В примере 7.18 появилась вторая переменная команда, выполняющая переадресацию строк палитры. При работе с форматом bgr значение адреса увеличивается на 3, а с форматом bgr0 — на 4. На практике нет никакой необходимости работать с переменной командой, ее второй операнд просто не должен зависеть от размера строки палитры.
Палитры форматов bgr и bgr0 используются в двух разных версиях стандарта BMP.
Заголовки файлов обрабатываются по единой схеме, не зависящей от версии (см. приложение А данной книги). При обработке заголовка обязательно определяется размер строки палитры т. к. он нужен при всех манипуляциях с палитрой. Поэтому вторым операндом команды add si, оз должно быть не значение константы, а имя регистра или переменной, в котором (в которой) хранится размер строки палитры.