有什么特别之处lea
that mov
不能做吗?
mov reg,imm
加载一个即时常量进入其目标操作数。立即常量直接编码在操作码中,例如mov eax,someVar
将被编码为B8 EF CD AB 00
如果地址为someVar
is 0x00ABCDEF
。 IE。将这样的指令编码为imm
是地址msg
你需要知道的确切地址msg
。在与位置无关的代码中,您事先并不知道它。
mov reg,[expression]
加载位于描述的地址处的值expression
。 x86指令的复杂编码方案允许有相当复杂的expression
: 一般来说是这样reg1+reg2*s+displ
, where s
可以是 0,1,2,4,reg1
and reg2
可以是通用寄存器或零,并且displ
是立即位移。在 64 位模式下expression
还可以有另一种形式:RIP+displ
,即地址是相对于下一条指令计算的。
lea reg,[expression]
使用所有这些复杂的方法来计算要加载的地址地址本身 into reg
(不像mov
,它取消引用计算出的地址)。因此,在编译时不可用的信息,即绝对地址,将位于RIP
,可以在不知道其值的情况下编码在指令中。 nasm 表达式lea rsi,[rel msg]
被翻译成类似的东西
lea rsi,[rip+(msg-nextInsn)]
nextInsn:
它使用相对地址msg-nextInsn
而不是绝对地址msg
,从而允许汇编器不知道实际地址但仍然对指令进行编码。