LEA和; MOV指令比较

时间:2014-12-03 04:39:50

标签: assembly x86 masm mov

说明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

1 个答案:

答案 0 :(得分:4)

在我的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)中。