В x86-64 Tour of Intel Manualsя прочитал
. Возможно, самым удивительным фактом является то, что такая инструкция, как
MOV EAX, EBX
, автоматически обнуляет старшие 32 бита. регистраRAX
.
Документация Intel (3.4.1.1 Регистры общего назначения в 64-битном режиме в базовой архитектуре вручную), цитируемая в том же источнике, говорит нам:
- 64-битные операнды генерируют 64-битный результат в общем- регистр цели.
- 32-битные операнды генерируют 32-битный результат, расширенный от нуля до 64-битного результата в целевом регистре общего назначения.
- 8-битные и 16-битные операнды генерируют 8-битный или 16-битный результат. Старшие 56 бит или 48 бит (соответственно) целевого регистра общего назначения не изменяются операцией. Если результат 8-битной или 16-битной операции предназначен для вычисления 64-битного адреса, явно расширьте регистр по знаку до полных 64-бит.
В ассемблере x86-32 и x86-64 16-битные инструкции, такие как
mov ax, bx
, не демонстрируют такого "странного" поведения, когда верхнее слово eax обнуляется.
Итак: по какой причине было введено такое поведение? На первый взгляд это кажется нелогичным (но причина может быть в том, что я привык к особенностям сборки x86-32).