gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:09:46 28 4
gpt4 key购买 nike

我是汇编语言的新手。我目前正在经历这个 Assembly Guide .我对 LEA 指令有疑问。我对LEA指令的理解是LEAsource operand的有效地址加载destination operand

以下示例来自同一链接。

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.

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

Introduction to assembly language


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

谢谢。

最佳答案

LEA 是 ALU shift+add 指令,它使用寻址模式语法和机器代码编码来利用硬件支持来解码此类操作。 ( It doesn't care if the inputs are addresses or not,所以你的问题的第二部分在那里得到了回答:lea eax, [ecx + eax*2] implements x*2 + y efficiently.)

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

有趣的事实:唯一的异常(exception)是如果 ModR/M 字节编码的是寄存器源而不是内存。例如lea eax, eax 如果您的汇编程序没有拒绝汇编它,或者如果您使用 db 伪指令手动编码它,则会出现#UD(未定义指令)错误.如果您使用 asm 而不是十六进制机器代码,那么在实践中这不是什么值得担心的事情。但是它不能接受任何依赖于数据的异常;它根本不关心它基于什么值运行。


在第 3 个中,我认为他们在谈论诸如 val equ 4val = 4 之类的东西,所以“val 的值” code>"是一个汇编时常量,不存储在内存中。

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

有趣的事实:MASM 忽略汇编时常量周围的 []: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 术语中,符号名称的值表示存储在内存中该地址的值。

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

lea eax, [var + edi] 是有意义的,你不能用 mov 做到这一点。但是您可以执行 mov eax, OFFSET var + 1234,因为汇编器 + 链接器必须能够支持填充 32 位符号 + 偏移值以用于寻址模式,如 [var + 1234 ]

在 64 位模式下,lea rax, [rel var] 在与位置无关的代码中有意义:您无法使用 mov 获得 RIP 相对地址.

关于汇编语言——LEA指令可以用来加载值吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48842830/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com