2015-02-19 9 views
0

Как процессор различает эти две команды?x64 Intel Opcode 81/2

81/2 iw - Добавить с переносом imm16 в r/m16.

81/2 id - Добавить с переносом imm32 в r/m32.

Единственное, что я могу видеть в инструкции, это размер непосредственного значения, и этого недостаточно, не так ли? Я имею в виду, что если сразу два байта, инструкция может быть сразу после него, и процессор не будет знать, было ли это 4 байта немедленного или 2 байта и другая инструкция.

Также я должен добавить префикс REX к ним для 64-разрядной операции или просто REX.R для 9-16 регистров?

ответ

0

Префикс размера режима и операнда. В 16-битном режиме 81/2 будет adc rm16, imm16. В режиме 32 или 64 бит он будет adc rm32, imm32. Если вы не добавите переопределение размера операнда, они переключают места.

Для того, чтобы он не adc rm64, imm32 (нет adc rm64, imm64), ему нужен префикс REX.W, REX.R бесполезно, так как нет г операнда, REX.B/X просто позволяет использовать расширенные регистры как (часть) операнда rm и не меняют размер операнда. Так, например, adc r8d, 0xDEADBEEF действителен и будет 41 81 D0 EF BE AD DE.

+0

Итак, в 64-битном режиме нет возможности использовать 16-битный регистр? –

+0

и почему он говорит, что 16-разрядная команда действительна в 64-битном режиме? –

+0

Если вы добавите переопределение размера операнда, оно станет 'adc rm16, imm16' в 32-битном и 64-битном режимах. – harold