Что делает флаг D в дескрипторе сегмента кода для инструкций x86-64?

Мантисса существенно сдвинута по показателю.

3 in binary is 0011
3>>1 in binary, equal to 3/2, is 0001.1
1
задан MikeF 13 July 2018 в 09:36
поделиться

1 ответ

Если для дескриптора сегмента кода установлен L (длинный режим), D должен быть ясным. Комбинация L = 1 / D = 1 в настоящее время бессмысленна / зарезервирована. Intel документирует это рядом в том же документе, на котором вы смотрели.

Если L понятен, тогда D выбирает между 16 и 32-битным режимом. (то есть размер операнда / адреса по умолчанию). И да, существует 16-битный защищенный режим, но нет, никто его не использует.


Существует только 3 варианта для адреса / операнда по умолчанию:

  • 16-битные режимы (real, vm86, protected): адрес по умолчанию и размер операнда = 16 бит
  • 32-битный защищенный режим: адрес по умолчанию и размер операнда = 32-бит
  • 64-битный режим: размер по умолчанию = 64-битный, по умолчанию - размер операнда-размер = 32-бит

Нет возможности иметь 16x 64-разрядные регистры, но размер операнда по умолчанию 16-бит или 64-бит. Или размер адреса по умолчанию, равный 32-битовому значению, равному 64.

4
ответ дан Peter Cordes 17 August 2018 в 13:15
поделиться
  • 1
    О, так что я делал, имея бит бит и установив бит D, был «незаконным». и именно поэтому я получил тройную ошибку, правильно? – MikeF 13 July 2018 в 16:02
  • 2
    Держитесь хотя. После прочтения документации Intel еще раз (той, что я показал выше) - почему они упоминают префиксы 66H и 67H в том же абзаце, где они обсуждают флаг D для исполняемого кода? Эти префиксы работают только в 64-битном режиме, когда в дескрипторе сегмента кода установлен флаг L. Поэтому, если в этом случае флаг D должен быть очищен, почему они вызывают эти префиксы? Это то, что меня смущает. – MikeF 13 July 2018 в 19:27
  • 3
    @MikeF: Нет, это префиксы REX, которые являются только длинными. Префиксы размера операнда меняются между 16 и 32-битными в 32-битном режиме так же, как в 64-битном режиме, или наоборот в 16-разрядном режиме. (например, add eax,eax нуждается в префиксе 66H в 16-битном режиме, но не в 32 или 64.) Посмотрите на какой-либо выход ассемблера для add eax, [esi] vs. add ax, [si] в режиме 16 против 32 бит. (например, запустите nasm -l, чтобы сделать список, включающий машинный код) – Peter Cordes 13 July 2018 в 23:09
  • 4
    О, круто. Я этого не знал. Благодарю. – MikeF 14 July 2018 в 01:22
Другие вопросы по тегам:

Похожие вопросы: