В x86-64 Обзор руководств Intel Я прочитал
Возможно, самым удивительным фактом является то, что команда типа
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).