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

         

Пересчет координат



Пример 7.4. Пересчет координат в адрес с использованием сдвига

Caladdr: mov ax, bperline ax = размер строки в байтах
raul dx dx:ax = Y*bperline
shl ex, k k=l для Hi-Color; k=2 для True Color
add ax, ex вычисляем младшую часть адреса
adc dx, 00 учитываем возможность переноса
xchg ax, dx обмен содержимого регистров
mul byte ptr GrUnit ax = al * GrUnit
add ax, Base_win !! если используется базовое окно
ret выход из подпрограммы

В примере 7.4 сдвигается не результат умножения, а только значение координаты х (содержимое регистра сх). Это возможно потому, что значение координаты Y (содержимое регистра dx) умножается не на Horsize, а на bperline = horsize*bytppnt.

Особенность операций сдвигов заключается в том, что величина сдвига может либо находиться в регистре el (младший байт регистра сх), либо указываться непосредственно в команде, других вариантов нет. Поэтому для автоматического выбора величины сдвига в примере 7.4 вместо двух подряд расположенных команд shl ex, k и add ax, сх надо записать следующие:

mov bx, wrdppnt ; bx = величина сдвига
xchg bx, ex ; обмен содержимого регистров
shl bx, cl ; сдвиг значения координаты X
add ax, bx ; вычисляем младшую часть адреса

Напомним, что если видеокарта в режиме True color поддерживает трехбайтовый код точки, то заменять умножение сдвигами не целесообразно.

Подведем итог. Первая из двух описанных подпрограмм универсальная, а вторая специализированная. Вопрос о том, какая из них лучше, вообще говоря, не корректен. Корректен другой вопрос — в каких случаях нужны универсальные подпрограммы, а в каких специализированные. Первые целесообразно составлять при разработке библиотечных модулей, особенно для языков высокого уровня. А если вы разрабатываете задачу, в которой большинство подпрограмм специализировано, то целесообразность включения в ее текст одной или нескольких универсальных подпрограмм весьма проблематична.



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