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]
也被称为负载。
它表示寄存器应该用作实际位置的指针,而不是作用于寄存器本身。