LEA & MOV 指令比较

Posted

技术标签:

【中文标题】LEA & MOV 指令比较【英文标题】:LEA & MOV instruction comparision 【发布时间】:2014-12-03 04:39:49 【问题描述】:

说明 1:

LEA DX, MESSAGE ; Move the address of MESSAGE in register DX

说明 2:

MOV DX, OFFSET MESSAGE ; Move the address of MESSAGE in register DX

问题:

上述指令是否相同?它们的工作原理似乎相似,但我刚刚开始编写汇编程序,所以我不能说。 如果两者相似,那么以上哪一种是完成上述任务的更好方法?

注意: 我已经读过这个question

【问题讨论】:

***.com/questions/1658294/… 只有当 MESSAGE 是一个全局变量时它们才等效。当变量存储在堆栈中或者是数组的元素时,LEA 开始发挥作用。您可以免费获得乘法和加法。 C 编译器真的很喜欢 LEA。汇编程序员不是那么多。 【参考方案1】:

在我的 32 位系统上,指令匹配操作码如下:

8d 15 c8 90 04 08       lea    0x80490c8,%edx
ba c8 90 04 08          mov    $0x80490c8,%edx

因此,如果您使用lea,则在将代码加载到内存时会使用一个额外的字节。

我发现有一次提到 AMD 芯片,lea 的延迟比mov 的延迟低,但只有一个时钟周期(如果数据不在 L1 缓存中,这将无关紧要)。我不确定这个结果是否适用于最近的处理器。

我发现lea 在尝试像这样向基地址添加偏移量时很有用:

lea message(,%esi,2), %ecx  # put address of message + 2 x ESI in ECX

而我不能这样做:

mov $message(,%esi,2), %ecx  # fails on bad syntax

这会产生错误的结果:

mov message(,%esi,2), %ecx  # puts _content_ at address, not address, into ECX 

至少在我的汇编器中(GNU as)。

【讨论】:

当指令没有输入依赖时延迟不是很有意义。它为该寄存器启动一个新的依赖链。 mov reg, offset label 总是更好,除了在 64 位代码中,RIP 相对 LEA 对 PIC 代码有用,或者在低 32 位之外加载的代码(RIP 相对 LEA 比 mov r64, imm64 好,但比 5 字节差mov r32, imm32 可用于 Linux 上与位置相关的 64 位代码。)

以上是关于LEA & MOV 指令比较的主要内容,如果未能解决你的问题,请参考以下文章

汇编中中括号[]作用以及lea和mov指令的区别

总结一下汇编中mov,lea指令的区别

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

请教各位高手,MOV SP,OFFSET TOP与LEA SP,TOP这两条指令都是一个意思,其中MOV指令为啥要加OFFSET?

汇编指令学习(MOV,MOVSX,MOVZX,LEA,XCHG)