Я пытаюсь понять, почему инструкция меняется с add[eax],al на add[rax],al при смене режима декодирования с x86 на x64.
Байты инструкции: 00 00.
Я думаю, это может быть потому, что он используется для указания места в памяти, но я не смог найти ничего, что могло бы доказать это.
Что касается документации, обратитесь к Руководству разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1: раздел «Базовая архитектура», раздел 3.6.1 «Размер операнда и размер адреса в 64-битном режиме».
Это связано с тем, что размер адреса по умолчанию составляет 64 бита в 64-битном режиме и 32 бита в 32-битном режиме.
Вы можете применить префикс переопределения размера адреса 67
, чтобы выбрать размер адреса 32 бита в 64-битных модах, однако 64-битный размер адреса недоступен за пределами 64-битного режима.
Префикс 67
в 32-битном режиме дает 16-битную адресацию, превращая 67 00 00
в add [bx+si], al
. Я думаю, вы хотели сказать, что это дает вам размер адреса 32 бита в 64-битном режиме.
@ChrisDodd Извините, мозговой пердеж. Теперь это исправлено.
64-битный режим, строго говоря, представляет собой другую ISA, поэтому машинный код может означать что-то другое. Например, префиксы
REX
являются перепрофилированными кодами операцийINC
/DEC
. Просто для удобства большинство опкодов означают одно и то же. Для каждого из них ссылка на набор команд дает значение в зависимости от режима. Но да, в 64-битном режиме размер адреса по умолчанию составляет 64 бита. Вы можете принудительно использовать 32-битный формат с помощью префикса переопределения размера адреса, чтобы67 00 00
былоadd [eax], al
.