Команды для манипуляции с точками
В графических режимах VESA, за исключением EGA graphics, доступ к видеобуферу ничем не отличается от доступа к оперативной памяти (ОЗУ, RAM). Поэтому для чтения или изменения содержимого байтов видеопамяти используются команды, выполняющие пересылку и сдвиг операндов, логические, арифметические и прочие операции.
Начиная с микропроцессора Intel 386, они могут манипулировать байтами, словами и двойными словами. Соответственно, при работе в режимах PPG одной командой можно обработать одну, две или четыре подряд расположенные на экране точки. Пересылка операндов является одним из наиболее частых действий при работе с видеопамятью. Ее выполняют команда mov и строковые команды movs, stos и lods. Напомним их основные свойства и различия.
Команда mov двухадресная, она копирует содержимое источника (source) в приемник (destination). Приемник всегда является первым операндом, а источник вторым. Команда допускает разные способы адресации операндов, от этого зависит конкретный код машинной инструкции, которую Макроассемблер формирует при компиляции. Однако оба операнда не могут одновременно находиться в памяти. Для копирования содержимого одного байта, слова или двойного слова в другой байт, слово или двойное слово нужны две команды пересылки, использующие в качестве посредника один из регистров общего назначения (табл. 3.1).
Таблица 3.1. Пересылка из памяти в память.
Пересылка байта | Пересылка слова | Пересылка двух слов |
---|---|---|
mov al, fs:[di] | mov ax, fs:[di] | mov eax, fs:[di] |
mov gs:[si], al | mov gs:[si], ax | mov gs:[si], eax |
При записи операндов команды mov можно использовать имена всех сегментных регистров: cs, ds, es, fs, gs и ss. Если сегментный регистр не указан явно, то подразумевается, что это ds. В сегментном регистре должно находиться конкретное значение сегмента обычной, расширенной или видеопамяти. Смещение (относительный адрес) байта, слова или двойного слова в этом сегменте, чаще всего, указывается в индексном регистре, имя которого заключается в квадратные скобки (это признак адреса). В табл. 3.1 при чтении из памяти полный адрес операнда задается в регистрах fs:di, а при записи в память – в регистрах gs:si.
Строковые инструкции lods, movs и stos отличаются от команды пересылки (mov) следующими особенностями:
- имя инструкции может содержать дополнительную пятую букву – b, w или d, указывающую количество пересылаемых байтов (1.2 или 4);
- если имя инструкции содержит пять букв, то операнды не указываются, их местонахождение определено по умолчанию и зависит от инструкции;
- после выполнения соответствующей пересылки содержимое индексных регистров, содержащих адреса операндов, увеличивается или уменьшается;
- увеличение или уменьшение адресов операндов зависит от состояния специального признака направления пересылки (direction flag);
- только перед строковой инструкцией может быть указана специальная команда rep, вызывающая ее многократное повторение.
Назначение инструкций пересылки, имена которых состоят из пяти букв, показано в табл. 3.2. Местонахождение операндов у них фиксировано, и изменить его нельзя. Один из операндов может находиться в регистре-аккумуляторе, а другой или оба – в оперативной памяти. Последняя буква имени инструкции (b, w или d) указывает, какой из этих регистров является аккумулятором – al, ах или еах.
Адрес операнда, находящегося в оперативной памяти, задается в одной из двух пар регистров – ds:si или es:di. Содержимое этой пары должно быть определено в задаче до выполнения инструкций пересылки.
Таблица 3.2. Назначение строковых операций.
Размер операнда в байтах | Чтение памяти в аккумулятор accum = ds:[si] | Запись аккумулятора в память es:[di] = accum | Пересылка из памяти в память es:[di] = ds:[si] |
---|---|---|---|
1 | lodsb | Stosb | movsb |
2 | lodsw | Stosw | movsw |
4 | lodsd | Stosd | movsd |