注册前的括号在 x86 中是什么意思?

What does parenthesis BEFORE register mean in x86?

在使用 IDA Pro 和 WinDbg 调试应用程序时,我遇到了以下语句。

mov esi, ds:(dword_16C6 - 16B2h)[esi]

为简化起见,假设

mov esi, ds:(ABC)[esi]

这里的(ABC)是什么意思?

在英特尔语法中,圆括号用于分组,就像在数学中一样。这样做是因为

ds:dword_16C6 - 16B2h[esi]

可能会被解释为

(ds:dword_16C6) - (16B2h[esi])

这没有任何意义。

在 AT&T 语法中,方括号用于分组。


换句话说,它是一种复杂的 ds:[esi + dword_16C6 - 16B2h]ds:dword_16C6[esi - 16B2h] 书写方式,它们也是有效的 MASM 语法(我认为)。

有些人可能会说过于复杂,但它确实与此反汇编程序用于符号 + 寄存器寻址模式的 symbol[index] 语法保持一致。