x86 asm中的括号是啥意思?

Posted

技术标签:

【中文标题】x86 asm中的括号是啥意思?【英文标题】:What do the brackets mean in NASM syntax for x86 asm?x86 asm中的括号是什么意思? 【发布时间】:2011-01-03 01:47:54 【问题描述】:

给定以下代码:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1

括号 ([L1]) 代表什么?

【问题讨论】:

请注意,MASM 中的括号很奇怪且不太简单:Confusing brackets in MASM32 通常它们表示取消引用,但有时它们会被忽略。 (有时即使没有括号它也会取消引用)。 【参考方案1】:

[L1] 表示地址 L1 的内存内容。在此处运行mov al, [L1] 后,al 寄存器将接收地址 L1 处的字节(字母 'w')。

【讨论】:

感谢您的回复,我开始学习asm了。如果我理解正确,“mov al,[L1]”会将“w”移动到 al,“mov eax,L1”会将 L1 的地址移动到 eax。对吗? 是的。如果你做了mov ebx,L1 -- mov al,[ebx] 那么al 在这种情况下也会是'w'。 LEA 除外。 @interjay,那么为什么第二行不需要括号:mov eax, L1 @Pacerier 这取决于你使用的汇编器,但通常没有括号它会得到内存地址,而不是内容。【参考方案2】:

这种类型的操作数,例如[ebp],称为memory operands。

这里的所有答案都很好,但我发现没有一个说明遵循这一严格规则的警告 - 如果括号,则取消引用除非是lea说明

lea 是上述规则的一个例外。假设我们已经

mov eax, [ebp - 4]

ebp 的值减去 4,括号表示将结果值作为地址,并且驻留在该地址的值存储在 eax 中。但是,在lea 的情况下,括号并不意味着:

lea eax, [ebp - 4]

ebp 的值减去 4,结果值存储在 eax 中。该指令将只计算地址并将计算的值存储在目标寄存器中。详情请见What is the difference between MOV and LEA?。

【讨论】:

第一个链接失效了。这是一个快照:web.archive.org/web/20180331051340/http://www.imada.sdu.dk/… @Hritik 感谢您标记损坏的链接!修复了一个更好的链接:)【参考方案3】:

简单的意思是在标签L1标记的地址处获取内存。

如果你喜欢 C,那么可以这样想:[L1]*L1 相同

【讨论】:

@user2485710 不,*p 表示取消引用 p 指向的字符。字符串与此无关。【参考方案4】:

括号表示取消引用地址。例如

mov eax, [1234]

意思是将地址1234的内容移动到EAX。所以:

1234 00001

EAX 将包含 00001。

【讨论】:

【参考方案5】:

Direct memory addressing - al 将加载位于内存地址 L1 的值。

【讨论】:

【参考方案6】:

与许多汇编语言一样,这意味着间接。换句话说,第一个mov 加载alL1内容(换句话说,字节'w'),而不是地址。

您的第二个mov 实际上会使用地址 L1 加载eax,您可以稍后取消引用它以获取或设置其内容。

在这两种情况下,L1 在概念上都被视为地址。

【讨论】:

【参考方案7】:

它们的意思是,与其将寄存器值或数值 L1 移动到寄存器 al 中,不如将寄存器值或数值 L1 视为指向内存的指针,获取该内存地址的内容,并将该内容移动到al

在这种情况下,L1 是一个内存位置,但如果寄存器名称在括号中,则同样的逻辑也适用:

mov al, [ebx]

也称为负载。

【讨论】:

【参考方案8】:

它表示该寄存器应该用作实际位置的指针,而不是作用于寄存器本身。

【讨论】:

以上是关于x86 asm中的括号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

这是啥意思 x86 汇编代码是啥意思? [复制]

关于VB中的括号是啥意思?

SQL中的列名上加中括号是啥意思

JSP中的美元花括号$是啥意思?

Java中的花括号本身是啥意思?

绑定路径中的括号是啥意思?