x86 asm中的括号是什么意思?
给出以下代码:
L1 db "word", 0 mov al, [L1] mov eax, L1
括号([L1])代表什么?
[L1]
表示地址L1的存储器内容。 运行mov al, [L1]
在这里,[ al
mov al, [L1]
寄存器将接收地址为L1的字节(字母'w')。
简单的说就是在标签L1标记的地址获取内存。
如果你喜欢C,那么可以这样想: [L1]
和*L1
是一样的
这种types的操作数,例如[ebp]
,被称为内存操作数 。
这里的所有答案都是好的,但是我看到没有人告诉我们这是一个严格的规则 – 如果方括号,然后解除引用 , 除了它是指令 。
lea
是上述规则的例外。 说我们已经
mov eax, [ebp - 4]
ebp
的值减4,括号表示结果值作为地址,驻留在该地址的值存储在eax
。 然而,在这种情况下,括号不意味着:
lea eax, [ebp - 4]
ebp
的值减4,结果值存储在eax
。 该指令将计算地址并将计算值存储在目标寄存器中。 看到这个职位进一步的细节。
方括号表示取消引用地址。 例如
mov eax,[1234]
意思是将地址1234的内容传送给EAX。 所以:
1234 00001
EAX将包含00001。
直接存储器寻址 – al
将被加载位于存储器地址L1
的值。
与许多汇编语言一样,这意味着间接。 换句话说,第一个mov
加载了L1
的内容 (换句话说就是字节'w'
),而不是地址。
你的第二个mov
实际上加载了地址为 L1
eax
,你可以稍后解除引用来获取或设置它的内容。
在这两种情况下, L1
在概念上被认为是地址。
这意味着不用将寄存器值或数值L1
移入寄存器al
,而是将寄存器值或数值L1
作为指向存储器的指针,取出该存储器地址的内容,并将该内容移动到al
。
在这种情况下,L1是一个内存位置,但是如果寄存器名称在括号中,则相同的逻辑将适用:
mov al, [ebx]
也被称为负载。
它表示寄存器应该用作实际位置的指针,而不是作用于寄存器本身。