Assembly (32位组件)can';在没有支架的情况下,你不能使用lea吗?

Assembly (32位组件)can';在没有支架的情况下,你不能使用lea吗?,assembly,x86,fasm,Assembly,X86,Fasm,据我所知,我还没有看到有人接触过这个,所以我使用的是一个平面汇编程序,如果我尝试做类似“leaeax,testing”的事情,它将不起作用,但如果我做了“leaeax,[testing]”,它会起作用吗? 我遇到过很多例子,我看到人们可以不用括号来做这件事,但我不知道在平面汇编程序上是否可以这样做,因为我一直得到错误无效操作数,而且“测试”是一个dd(双字) leaeax[测试]和moveax的最后一件事是,在我的平面汇编程序上测试是等价的。我使用ollydbg调试器测试了eax寄存器,在这两种

据我所知,我还没有看到有人接触过这个,所以我使用的是一个平面汇编程序,如果我尝试做类似“leaeax,testing”的事情,它将不起作用,但如果我做了“leaeax,[testing]”,它会起作用吗? 我遇到过很多例子,我看到人们可以不用括号来做这件事,但我不知道在平面汇编程序上是否可以这样做,因为我一直得到错误无效操作数,而且“测试”是一个dd(双字)


leaeax[测试]和moveax的最后一件事是,在我的平面汇编程序上测试是等价的。我使用ollydbg调试器测试了eax寄存器,在这两种情况下,eax都等于地址00401006。因此,在这种情况下,它们是等价的正确吗?

因为LEA类似于C中的“&”,它希望您向它传递一个变量,而不是向该变量传递一个地址。在FASM中,当您写入“[a]”时,您将引用变量“a”,而当您仅写入“a”时,您将引用其地址。所以,“lea-eax,[a]”和“mov-eax,a”的意思完全相同。我希望这能有所帮助。

在询问有关语法的问题时,包括您正在使用的汇编程序的名称是至关重要的。这里的“正确答案”在x86汇编程序之间差异很大。Nasm/Yasm要求在内存访问(包括LEA)中使用方括号。听起来不太离谱,但它被称为“flat assembler 1.71.22”。我想这是正确的,就我所知,语法是intelAs。FASM使用的语法与我刚才提到的类似。这意味着访问内存时总是需要括号。如果您只想在寄存器中输入标签的地址,请使用不带括号的MOV。谢谢,汇编很混乱。我只是不想忽略任何事情,不幸的是,我需要花很多时间来理解它。请注意,在某些情况下,您无法轻松地将
lea
替换为
MOV
,这就是它更有用的地方。例如
leaeax[esp+8]
获取局部变量的地址,或
leaeax[eax+4*ecx+foo]
获取数组项的地址。