给出以下代码:
L1 db "word", 0
mov al, [L1]
mov eax, L1
括号([L1])代表什么?
答案 0 :(得分:44)
[L1]
表示地址L1的内存内容。在此处运行mov al, [L1]
后,al
寄存器将在地址L1(字母'w')处接收字节。
答案 1 :(得分:34)
此类操作数(例如[ebp]
)称为memory operands。
这里的所有答案都很好,但是我看到没有人告诉我这是一个严格的规则 - 如果是括号,那么取消引用,,除非它是什么lea
指令。
lea
是上述规则的例外。说我们
mov eax, [ebp - 4]
ebp
的值减去4,括号表示结果值被视为地址,驻留在该地址的值存储在eax
中。但是,在lea
的情况下,括号不代表:
lea eax, [ebp - 4]
ebp
的值减去4,结果值存储在eax
中。该指令只计算地址并将计算出的值存储在目标寄存器中。有关详细信息,请参阅this post。
答案 2 :(得分:30)
简单地意味着将内存放在标签L1标记的地址上。
如果您喜欢C,请按照以下方式考虑:[L1]
与*L1
相同
答案 3 :(得分:6)
括号表示取消引用地址。例如
mov eax, [1234]
表示将地址1234的内容移动到EAX。所以:
1234 00001
EAX将包含00001。
答案 4 :(得分:2)
Direct memory addressing - al
将加载位于内存地址L1
的值。
答案 5 :(得分:1)
它们意味着不是将寄存器或数值L1
的值移动到寄存器al
中,而是将寄存器值或数值L1
视为指向内存的指针,取指令该内存地址的内容,并将该内容移动到al
。
在这种情况下,L1是一个内存位置,但如果寄存器名称在括号中,则会应用相同的逻辑:
mov al, [ebx]
也称为负载。
答案 6 :(得分:0)
与许多汇编语言一样,这意味着间接。换句话说,第一个mov
加载al
{em>内容 L1
(换句话说,字节为'w'
),而不是地址。
您的第二个mov
实际上会使用地址 eax
加载L1
,您可以稍后取消引用该内容以获取或设置其内容。
在这两种情况下,L1
在概念上被认为是地址。
答案 7 :(得分:0)
它表示寄存器应该用作实际位置的指针,而不是作用于寄存器本身。