括号在x86 asm中的含义是什么?

joe*_*975 56 x86 assembly

给出以下代码:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1
Run Code Online (Sandbox Code Playgroud)

括号([L1])代表什么?

int*_*jay 47

[L1]表示地址L1处的存储器内容.在mov al, [L1]此处运行后,al寄存器将接收地址L1处的字节(字母"w").

  • 谢谢你的回复,我开始学习asm.如果我理解正确,"mov al,[L1]"会将'w'移动到al,而"mov eax,L1"会将L1的地址移动到eax中.那是对的吗? (6认同)
  • 是.如果你做了'mov ebx,L1 - mov al,[ebx]`那么`al`在那种情况下也会是'w'. (6认同)
  • 例外是LEA. (3认同)

leg*_*s2k 36

这种类型的操作数[ebp]称为内存操作数.

这里的所有答案都很好,但是我看到没有人告诉我这是一个严格的规则 - 如果是括号,那么取消引用,除非它是lea指令.

lea是上述规则的例外.说我们已经

mov eax, [ebp - 4]
Run Code Online (Sandbox Code Playgroud)

值的值ebp减去4,括号表示结果值作为地址,并存储在该地址的值eax.但是,在lea这种情况下,括号不代表:

lea eax, [ebp - 4]
Run Code Online (Sandbox Code Playgroud)

将值ebp减去4,并将结果值存储在中eax.该指令只计算地址并将计算出的值存储在目标寄存器中.有关详细信息,请参阅此帖子.


Ear*_*rlz 30

简单地说就是将内存放在标签L1标记的地址上.

如果你喜欢C,那就这样想:就像[L1]是一样*L1

  • @ user2485710不,`*p`表示取消引用`p`指向的字符.字符串与此无关. (21认同)

Jas*_*ans 6

括号意味着取消引用地址.例如

mov eax, [1234]
Run Code Online (Sandbox Code Playgroud)

表示将地址1234的内容移动到EAX.所以:

1234 00001
Run Code Online (Sandbox Code Playgroud)

EAX将包含00001.