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
加载al
与L1
的内容(换句话说,字节'w'
),而不是地址。
您的第二个mov
实际上会使用地址 L1
加载eax
,您可以稍后取消引用它以获取或设置其内容。
在这两种情况下,L1
在概念上都被视为地址。
【讨论】:
【参考方案7】:它们的意思是,与其将寄存器值或数值 L1
移动到寄存器 al
中,不如将寄存器值或数值 L1
视为指向内存的指针,获取该内存地址的内容,并将该内容移动到al
。
在这种情况下,L1 是一个内存位置,但如果寄存器名称在括号中,则同样的逻辑也适用:
mov al, [ebx]
也称为负载。
【讨论】:
【参考方案8】:它表示该寄存器应该用作实际位置的指针,而不是作用于寄存器本身。
【讨论】:
以上是关于x86 asm中的括号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章