Директивы EVEN и EVENDATA
Вы можете использовать директиву EVEN для округления счетчика адреса до следующего четного адреса. Директива EVEN позволяет вам выравнивать код для эффективного доступа к процессорам, использующим 16-разрядную шину данных. Производительность процессоров, использующих 8-разрядную шину данных, директивой EVEN не улучшается.
Директива EVENDATA выполняет выравнивание на четную границу, изменяя счетчика адреса без генерации данных, что полезно использовать для неинициализированных сегментов. Директивы EVEN и EVENDATA приводят к тому, что если выравнивание текущего сегмента выполнено недостаточно строго, Турбо Ассемблер выводит предупреждающее сообщение.
Если когда встречается директива EVEN счетчик адреса имеет нечетное значение, то Турбо Ассемблер помещает в сегмент один байт или инструкцию NOP, чтобы счетчик адреса стал четным. С помощью заполнения инструкциями NOP директиву EVEN можно в сегментах кода, не вызывая на этапе работы программы выполнения неверных инструкций. Если счетчик адреса уже имеет четное значение, то данная директива не действует.
Аналогично, если счетчик адреса имеет нечетное значение, когда встречается директива EVENDATA, Турбо Ассемблер генерирует неинициализированный байт.
Приведем следующий пример использования директивы EVEN:
EVEN @@A: lodsb xor bl,al ; выравнивание для эффективного доступа loop @@a
Приведем пример использования директивы EVENDATA:
EVENDATA VAR1 DW 0 ; выравнивание для эффективного ; доступа 8086
Директива ALIGN
Для выравнивания счетчика адреса на адрес, значение которого равно степени 2, можно использовать директиву ALIGN. Директива ALIGN имеет следующий синтаксис:
ALIGN граница
где "граница" должна быть степенью 2.
Если счетчик адреса еще не соответствует смещению, которое представляет собой произведение "границы", Турбо Ассемблер, чтобы присвоить счетчика адреса нужный адрес, вставляет в сегмент инструкции NOP (нет операции).
Вы не можете выполнить надежное выравнивание на границу, являющееся более строгим, чем выравнивание сегмента, в котором встречается директива ALIGN. Выравнивание сегмента задается, когда сегмент в первый раз начинается по директива SEGMENT.
Например, если вы определили сегмент следующим образом:
CODE SEGMENT PARA PUBLIC
затем вы можете задать ALIGN 16 (что эквивалентно PARA), но не ALIGN 32, как как это более строгое выравнивание, чем выравнивание, заданное в директиве SEGMENT с помощью PARA. Если выравнивание сегменте недостаточно строгое, то директива ALIGN генерирует предупреждающее сообщение.
Использование директивы ALIGN показано в следующем примере:
ALIGN 4 ; выравнивание на границу DWORD для 386 BignNum DD 12345678
1 2 3
8 8 8
| |