Разница между MOVZX r32, r / m16 и MOVZX r64, r / m16 в 64-битной x86 - PullRequest
2 голосов
/ 23 апреля 2020

И MOVZX r32, r / m16, и MOVZX r64, r / m16 имеют код операции 0F B7, но последний имеет префикс REX.W. Что отличает эти две инструкции? В любом случае они не должны обнулять старшие 32 бита операнда назначения, поскольку согласно

Intel 64 and IA-32 Architectures - Software Developer’s Manual, Volume 1, 3.4.1.1
    : General-Purpose Registers in 64-Bit Mode.

выполняется следующее утверждение:

32-bit operands generate a 32-bit result,
    zero-extended to a 64-bit result in the destination general-purpose register.

1 Ответ

2 голосов
/ 23 апреля 2020

Нет разницы в том, что делают эти две инструкции, просто в том, как они кодируются. Это не отличается от того, как XOR EAX, EAX и XOR RAX, RAX делают то же самое, но первый на один байт короче. (XOR RAX, RAX также имеет недостаток, заключающийся в том, что он не нарушает зависимости от Silvermont, но это различие не относится к MOVZX.)

Даже до x86-64 существовали различные способы кодирования, которые по сути были одной и той же инструкцией (например, SUB EAX, EAX), автоматическое c обнуление верхней части регистров просто добавляет больше.

...