英特尔汇编语法中是否需要 ptr 关键字?

Is ptr keyword necessary in Intel assembly syntax?

括号和PTR都暗示后面的值(内存地址或寄存器值)被解引用,从语言设计的角度来看,是否真的有必要让它们同时出现?

is it really necessary to have both of them to appear at the same time from language design perspective?

通常不会。虽然您必须特别指出您想要符号的值(而不是地址),但既不要求也不禁止同时使用两者。

使用方括号只是许多人用来表示他们使用的是值,而不是地址或指针的约定。有时你会听到它叫做 "contents".


如果您想要查看两者都需要的示例,请参阅Addressing variables (or, what is ML64 generating?)。但这并不是语言要求 本身 。相反,两者都是必需的,因为 MASM/ML 和 MASM64/ML64.

使用相同的来源

在 MASM64/ML64 下,汇编程序似乎无法正确处理符号定义和快速调用,因此由于 <symbolic name> EQU <register>,两者都需要。或者,也许代码是这样写的,所以汇编程序 无法 处理它...

如果你仔细观察,你会看到 MASM 使用基本相对寻址(所有内容都通过 EBP 访问),而 MASM64 由于 fastacll 而有不同的要求,其中前两个参数可用通过寄存器(ECXEDX)。


Both brackets and PTR imply the following value (memory address or register value)

您可能已经知道这一点,但万一其他人发现它有用...

在 C 中,你总是处理值并且必须做一些特殊的事情来获取地址:

int value = 1;

在您的 C 代码中,您将始终使用 1,除非您获取变量的地址。

在 ASM 中,正好相反。当您声明一个变量并象征性地引用它时:

LOCAL value:QWORD

除非您采取特殊步骤来处理值,否则您始终使用地址。要获取该值,您可以使用 QWORD PTR value[value]。或者你可以同时使用QWORD PTR [value],这是无害的。