汇编语言——LEA指令可以用来加载值吗

Assembly language - can LEA instruction be used to load value

我是汇编语言的新手。我目前正在经历这个 Assembly Guide。我对 LEA 指令有疑问。我对LEA指令的理解是LEA源操作数的有效地址加载目标操作数

以下示例来自同一个 link。

lea edi, [ebx+4*esi] — the quantity EBX+4*ESI is placed in EDI.
lea eax, [var] — the value in var is placed in EAX.
lea eax, [val] — the value val is placed in EAX.

在上面的第 2 和第 3 个示例中,注释说该值已加载到 EAX 中。这是我的困惑。请让我知道 LEA 指令是否可以用于加载有效地址以及目标操作数中的值。


上图来自Introduction to assembly language来自youtube的Open SecurityTraining频道。

谢谢。

LEA 的字面意思是 "Load Effective Address." 它首先计算一个地址 - 称为 "effective" 因为它可能由几个部分组成,结果是 有效地 结束up in the destination - 并在某处加载该地址。
虽然 [var] 使用寻址模式,但 lea 仅计算地址并将其存储在目标位置,它不使用它从主内存加载一些东西。 "the value in var" 是错误的,"the value var" 更准确,如果 "var" 指的是标签地址,而不是存储值。

由于消息来源明确表示“[...] 内存位置的内容未加载,仅计算有效地址并将其放入寄存器,”我认为这只是一个误导性的错字,而不是错误信息。

LEA 是一个 ALU shift+add 指令,它使用 addressing-mode 语法和 machine-code 编码来利用硬件支持对这种操作进行解码。 (,所以你的问题的第二部分在那里得到了回答:lea eax, [ecx + eax*2] 有效地实现了 x*2 + y。)

在任何情况下,lea 都不会从内存中加载或存储。参见 Intel's instruction-manual entry for it

有趣的事实:唯一的例外是 ModR/M 字节编码寄存器源而不是内存。例如lea eax, eax 如果您的 assembler 没有拒绝 assemble 它,或者如果您用 db pseudo-instruction.如果您使用 asm 而不是十六进制机器代码,那么在实践中这不是什么值得担心的事情。但是它不能接受 data-dependent 例外;它根本不关心它的操作值是什么。


在第 3 个中,我认为他们在谈论类似 val equ 4val = 4 的内容,因此 "the value of val" 是一个 assemble-time 常量,不存储在内存中.

是的,您可以为此使用 LEA(或任何 32 位常量),但 mov eax, val 更短且更有效。使用具有绝对 disp32 寻址模式的 LEA 毫无意义。

有趣的事实:MASM 忽略 assemble-time 周围的 [] 常量:mov eax, [val] 是一个 mov eax, imm32,与 mov eax, val 相同。 Ross Ridge 在 Confusing brackets in MASM32.

上写了一个很好的答案
lea eax, [var] — the value in var is placed in EAX.

评论有误。 var地址放在EAX中。在正常的 asm 术语中,值 in 符号名称表示存储在内存中该地址的值。

mov eax, OFFSET varlea eax, [var] 更高效、更短。 有些人喜欢写 lea,因为 "semantic" 对人类读者来说意味着:获取地址。但是如果你用汇编语言编写,人类的可读性应该排在效率之后,并且只有 tie-breaker,例如选择 esi 作为源指针时,选择没有其他区别。 (很好地格式化/缩进你的代码,并很好地注释它。)

lea eax, [var + edi] 是有道理的,你不能用 mov 做到这一点。但是你可以做 mov eax, OFFSET var + 1234,因为 assemblers + 链接器必须能够支持填充 32 位符号+偏移值以用于 [var + 1234].

等寻址模式

在 64 位模式下,lea rax, [rel var] 在 position-independent 代码中有意义:您无法使用 mov.

获得 RIP-relative 地址