Сбой проверки выравнивания может генерироваться при доступе к невыравненным операндам. Например, слово, записанное по нечетному адресу памяти, или двойное слово, записанное по адресу, не кратному четырем. В Таблице 9-6 приводятся требования к выравниванию по типам данных. Для разрешения контроля выравнивания должны выполняться следующие условия:
Бит AM регистра CR0 должен быть установлен.
Флаг AC должен быть установлен. - CPL должен быть равен 3 (уровень пользователя).
Таблица 9-6. Требования к выравниванию по типам данных -----------------------------------------------------------------Тип данных Адрес должен нацело делиться на-----------------------------------------------------------------Слово 2Двойное слово 4Короткое вещественное 4Длинное вещественное 8Временное вещественное 8Селектор 248-разрядный сегментированный указатель 432-разрядный плоский указатель 432-разрядный сегментированный указатель 248-разрядный "Псевдо-дескриптор" 4Область хранения FSTENV/FLDENV 4 или 2, в зависимости от размера операндаОбласть хранения FSAVE/FRSTOR 4 или 2, в зависимости от размера операндаБитовая строка 4-----------------------------------------------------------------
Проверку выравнивания полезно использовать в программах, в которых два младших бита указателей служат для идентификации адресуемой ими структуры данных. Например, подпрограмма в библиотеке математических функций может принимать указатели на числовые структуры данных. Если типу этой структуры в двух младших битах указателей на этот тип назначен код 10 (двоичный), математические подпрограммы могут выполнить для этого кода типа коррекцию, добавляя смещение -10 (двоичное). Если подпрограмма получит неверный тип указателя, то произойдет невыравненная ссылка, что приведет к генерации исключения.
Сбои проверки выравнивания генерируются только в режиме пользователя (уровень привилегированности 3). Ссылки к памяти с уровнем привилегированности по умолчанию 0, такие как загрузка дескриптора сегмента, не генерируют сбоев проверки выравнивания, даже если они вызваны ссылками к памяти, выполненными в пользовательском режиме.
Запись 48-разрядного псевдо-дескриптора (образа памяти для содержимого базового регистра таблицы дескрипторов) в режиме пользователя может генерировать сбой проверки выравнивания. Хотя программы режима пользователя обычно не сохраняют псевдо-дескрипторов, такого сбоя можно избежать, выравнивая псевдодескриптор по адресу нечетного слова (т.е. адресу, являющемуся 2 MOD 4).
Команды FSAVE и FRSTOR генерируют невыравненные ссылки, которые могут вызвать сбой проверки выравнивания. Прикладным программам эти команды нужны редко.