Opcode | Instruction | Op/En | 64-Bit Mode | Compat/Leg Mode | Description |
REX.W + 8D /r | LEA r64,m | RM | Valid | N.E. | Store effective address for m in register r64. |
Op/En | Operand 1 | Operand 2 | Operand 3 | Operand 4 |
RM | ModRM:reg (w) | ModRM:r/m (r) | NA | NA |
Иван в своей программе использовал загрузку константы командой mov.
У меня в программе было не так, я использовал lea.
А есть ли разница?
https://www.felixcloutier.com/x86/lea
В таблицах, описывающих инструкции Интел64 есть странная колонка:
Instruction Operand Encoding
Op/En
Значения в этой колонке могут быть:
RM
MR: Memory/Register (Память/Регистр) - обратный формат RM.
MI: Memory/Immediate (Память/Немедленное значение) - инструкция принимает операнд из памяти и немедленное значение.
RI: Register/Immediate (Регистр/Немедленное значение) - инструкция принимает операнд из регистра и немедленное значение.
I: Immediate (Немедленное значение) - инструкция принимает только немедленное значение.
В формате RM инструкция может использовать один из следующих способов адресации:
Регистр (R): операнд находится в регистре.
Память (M): операнд находится в памяти, и его адрес определяется регистром или комбинацией регистров.
В официальной документации Intel64, в частности, в документе
"Intel 64 and IA-32 Architectures Software Developer's Manual" (том 2, раздел 3),
есть раздел "Instruction Format" (Формат инструкций), где описывается формат инструкций и кодирование операндов.
3.1 INTERPRETING THE INSTRUCTION REFERENCE PAGES
This section describes the format of information contained in the instruction reference pages in this chapter. It
explains notational conventions and abbreviations used in these sections.
3.1.1 Instruction Format
The following is an example of the format used for each instruction description in this chapter. The heading below
introduces the example. The table below provides an example summary table.
REX.W — Indicates the use of a REX prefix that affects operand size or instruction semantics. The ordering of
the REX prefix and other optional/mandatory instruction prefixes are discussed Chapter 2. Note that REX
prefixes that promote legacy instructions to 64-bit behavior are not listed explicitly in the opcode column.
/r — Indicates that the ModR/M byte of the instruction contains a register operand and an r/m operand.
VEX префикс был введен в архитектуру Intel Sandy Bridge (2011 год) и AMD Bulldozer (2011 год) для поддержки новых SIMD инструкций, таких как AVX (Advanced Vector Extensions) и FMA (Fused Multiply-Add).
VEX (Vector Extension) prefix - это префикс, используемый в инструкциях x86-64 для расширения функциональности SIMD (Single Instruction, Multiple Data) инструкций.
Такое нам пока не нужно и делать мы его пока не будем.
#UD
If source operand is not a memory location.
If the LOCK prefix is used.
#UD пока не будем генерировать, а LOCK prefix использовать (хотя интересно было бы, но после).
Vol. 2A 3-537 (Страница 1108 в моём документе):
The source operand is a memory address (offset part) specified with one of the processors addressing modes;
Мне во всём этом описании непонятно:
1) почему они когда описывали код инструкции ничего не написали про константу?
Об эмуляторе Интел64 в Сказочной Колеснице
# 0x48 0x8d 0xb6 0x2b 0x00 0x00 0x00
lea distance(%rsi), %rsi
2) где это описано в официальной документации?
3) почему константа такая короткая (всего 4 байта)
4) почему реальный код другой:
Об эмуляторе Интел64 в Сказочной Колеснице
00000000 488D3523000000 lea rsi,[rel 0x2a]
Отредактировано Лис (2024-08-22 18:16:30)