LEA 和 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

问题:

  • 上述说明是否相同?它们似乎工作得类似,但我刚刚开始编程汇编,所以我不能说。
  • 如果它们都相似,那么以上哪一个是完成上述任务的更好方法?

注意:我已经读过这个问题

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

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

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

我发现 AMD 芯片一度具有比mov更低的 lea 延迟,但只有一个时钟周期(如果数据不在 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)中。

最新更新