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] 

也被称为负载。

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