Я пытаюсь понять, как работает D flag
в дескрипторе сегмента кода при использовании в коде x86-64. Он установлен в D/B
бите 22 дескриптора сегмента кода, как показано на этой диаграмме:
Документация Intel (из раздела 3.4.5 Дескрипторы сегмента) утверждает следующее:
Флаг D / B (размер операции по умолчанию / размер указателя стека по умолчанию и / или верхняя граница)
Выполняет разные функции в зависимости от того, является ли дескриптор сегмента сегментом исполняемого кода, сегментом раскрываемых данных или сегментом стека. (Этот флаг всегда должен быть установлен в 1 для 32-битных сегментов кода и данных и в 0 для 16-битных сегментов кода и данных.)
• Сегмент исполняемого кода. Флаг называется флагом D и указывает длину по умолчанию для эффективных адресов и операндов, на которые ссылаются инструкции в сегменте. Если этот флаг установлен, предполагается, что 32-битные адреса и 32-битные или 8-битные операнды; если он ясен, предполагается, что 16-битные адреса и 16-битные или 8-битные операнды. Префикс инструкции 66H может использоваться для выбора размера операнда, отличного от значения по умолчанию, а префикс 67H может использоваться для выбора размера адреса, отличного от значения по умолчанию.
Вот и пытаюсь понять, на какие инструкции x86-64 это влияет и как?
PS. Когда я пытаюсь запустить некоторые тесты (в ядре Windows), установив этот бит, ОС сразу же утроит ошибку.