Почему инструкции x86-64 для 32-битных регистров обнуляют верхнюю часть полного 64-битного регистра?

В 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).

97
задан Nubok 1 August 2018 в 16:49
поделиться