Иллюстрированный самоучитель по SVGA

Команды для манипуляции с точками

В графических режимах 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.