Assembly LEA&;MOV指令比较

Assembly LEA&;MOV指令比较,assembly,x86,masm,mov,Assembly,X86,Masm,Mov,说明1: LEA DX, MESSAGE ; Move the address of MESSAGE in register DX MOV DX, OFFSET MESSAGE ; Move the address of MESSAGE in register DX 说明2: LEA DX, MESSAGE ; Move the address of MESSAGE in register DX MOV DX, OFFSET MESSAGE ; Move the address of ME

说明1:

LEA DX, MESSAGE ; Move the address of MESSAGE in register DX
MOV DX, OFFSET MESSAGE ; Move the address of MESSAGE in register DX
说明2:

LEA DX, MESSAGE ; Move the address of MESSAGE in register DX
MOV DX, OFFSET MESSAGE ; Move the address of MESSAGE in register DX
问题:
  • 上述说明是否相同?它们的工作原理似乎类似,但我刚刚开始编写汇编程序,所以我不能说
  • 如果两者相似,那么上面哪一个是完成上述任务的更好方法
注:
我已经在我的32位系统上读过这篇

,指令与操作码匹配如下:

8d 15 c8 90 04 08       lea    0x80490c8,%edx
ba c8 90 04 08          mov    $0x80490c8,%edx
lea message(,%esi,2), %ecx  # put address of message + 2 x ESI in ECX
因此,如果您使用
lea
,那么在将代码加载到内存中时,您将使用一个完整的额外字节

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

我发现
lea
在尝试向基址添加偏移量时非常有用,如下所示:

8d 15 c8 90 04 08       lea    0x80490c8,%edx
ba c8 90 04 08          mov    $0x80490c8,%edx
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)中是这样。

只有消息是全局变量时,它们才是等价的。当变量存储在堆栈上或是数组的一个元素时,LEA开始得到回报。你可以免费得到一个乘法和一个加法。C编译器非常喜欢LEA。汇编程序员则不然。当指令没有输入依赖项时,延迟不是很有意义。它为该寄存器启动一个新的依赖链
mov reg,offset label
总是更好,除了在64位代码中RIP relative LEA对PIC代码有用,或者在低32位之外加载的代码(RIP relative LEA比
mov r64,imm64
好,但比5字节
mov r32,imm32
差,后者可用于Linux上的位置相关64位代码。)