Мантисса существенно сдвинута по показателю.
3 in binary is 0011
3>>1 in binary, equal to 3/2, is 0001.1
Если для дескриптора сегмента кода установлен L
(длинный режим), D
должен быть ясным. Комбинация L = 1 / D = 1 в настоящее время бессмысленна / зарезервирована. Intel документирует это рядом в том же документе, на котором вы смотрели.
Если L
понятен, тогда D
выбирает между 16 и 32-битным режимом. (то есть размер операнда / адреса по умолчанию). И да, существует 16-битный защищенный режим, но нет, никто его не использует.
Существует только 3 варианта для адреса / операнда по умолчанию:
Нет возможности иметь 16x 64-разрядные регистры, но размер операнда по умолчанию 16-бит или 64-бит. Или размер адреса по умолчанию, равный 32-битовому значению, равному 64.
66H
и67H
в том же абзаце, где они обсуждают флагD
для исполняемого кода? Эти префиксы работают только в 64-битном режиме, когда в дескрипторе сегмента кода установлен флагL
. Поэтому, если в этом случае флагD
должен быть очищен, почему они вызывают эти префиксы? Это то, что меня смущает. – MikeF 13 July 2018 в 19:27add eax,eax
нуждается в префиксе 66H в 16-битном режиме, но не в 32 или 64.) Посмотрите на какой-либо выход ассемблера дляadd eax, [esi]
vs.add ax, [si]
в режиме 16 против 32 бит. (например, запуститеnasm -l
, чтобы сделать список, включающий машинный код) – Peter Cordes 13 July 2018 в 23:09