(汇编 32 位)不能使用 lea 没有括号?

Posted

技术标签:

【中文标题】(汇编 32 位)不能使用 lea 没有括号?【英文标题】:(Assembly 32 bit) can't use lea without the brackets? 【发布时间】:2015-02-08 03:59:23 【问题描述】:

据我所知,我还没有看到任何人接触过这个,所以我使用的是平面汇编程序,如果我尝试做这样的事情“lea eax,testing”它不会工作,但如果我这个“lea eax,[testing]”行得通吗? 我遇到的很多例子我看到人们可以在没有括号的情况下做到这一点,但我不知道这是否可以在平面汇编器上完成,因为我不断收到错误无效操作数,“测试”也是一个 dd(双词)。

最后一件事 lea eax,[testing] 和 mov eax,testing 在我的平面汇编器上是等效的。我用 ollydbg 调试器测试了 eax 寄存器,在这两种情况下,eax 都等于地址 00401006。那么在这种情况下它们是等价的吗?

【问题讨论】:

在询问有关语法的问题时,包括您正在使用的汇编程序的名称是最重要的。这里的“正确答案”在 x86 汇编器之间差别很大。 Nasm/Yasm 要求使用括号进行内存访问(包括 LEA)。 听起来不是太无聊,但它被称为“平面汇编器 1.71.22”,我想这是正确的,语法也是英特尔 据我所知,FASM 使用的语法类似于我刚才提到的语法。这意味着内存访问始终需要括号。如果您只想要寄存器中标签的地址,请使用不带括号的 MOV。 谢谢,组装很混乱,我只是不想忽略任何事情,不幸的是,我需要花费很多时间来解决它。 请注意,在某些情况下,您无法轻松地将 lea 替换为 mov,而这正是它更有用的地方。如lea eax, [esp+8]获取局部变量地址,lea eax, [eax + 4*ecx + foo]获取数组项地址。 【参考方案1】:

因为 LEA 就像 C 中的“&”一样,它希望您将变量传递给它,而不是传递给该变量的地址。在 FASM 中,当你写“[a]”时,你指的是变量“a”,而当你只写“a”时,你指的是它的地址。所以,“lea eax,[a]”和“mov eax,a”的意思完全一样。我希望这会有所帮助。

【讨论】:

以上是关于(汇编 32 位)不能使用 lea 没有括号?的主要内容,如果未能解决你的问题,请参考以下文章

汇编中中括号[]作用以及lea和mov指令的区别

64位的汇编怎么搞

汇编语言16位环境搭建(Windows 7 32位)

汇编语言寄存器存储器问题

汇编指令学习(MOV,MOVSX,MOVZX,LEA,XCHG)

总结一下汇编中mov,lea指令的区别