这条指令中的 PTR 不是多余的 CALL DWORD PTR [XXXXXXXX]
。如果指令是CALL DWORD [XXXXXXXX]
这也说,调用位于地址 XXXXXXXXX 的 DWORD 长度值。
那为什么要PTR?
在 masm 用语中,DWORD PTR 是一个指针覆盖,IOW 你通常称之为强制转换。它的基本意思是“将地址 XXXXXXXX 视为 DWORD 指针”。
masm 实际上键入它的数据项。所以如果 XXXXXXXX 以前被定义为
XXXXXXXX DWORD SomeAddress ; Presumably a function entry point.
然后
CALL XXXXXXXX
就足够了,并且会生成与
CALL DWORD PTR XXXXXXXX
OTOH,如果由于某种原因,XXXXXXXXX 被定义为
XXXXXXXX WORD ?
WORD ?
那么让 MASM 组装对 XXXXXXXX 的调用而不产生 MAMS 错误的唯一方法是
CALL DWORD PTR XXXXXXXX
在这种情况下,方括号 [ ] 不会带来任何好处,顺便说一句。对于其他一些汇编器,它们表示间接。在上面的例子中,masm 不需要它们。在其他上下文中(基数 + 索引表达式),它们用于将索引寄存器和/或值括起来。
哦,顺便说一句:
CALL DWORD [XXXXXXXX]
今天是一种不寻常的 masm 语法(根据 masm 6 文档书籍及其示例),并且可能与一些较旧的 masm 语法相对应的兼容性允许。
如果我没记错的话,“PTR”运算符就在那里,因为在 MASM 中,有时您可以拥有一个看起来像常规值但实际上是指针的表达式。
如果这两个语句都对您有用,我只能说,将它们组合起来并确保它们都生成相同的字节。它们应该是一样的,考虑到“xxxxxxxx”在[xxxxxxxx]
定义上是一个指针,但是自从我上次在 MASM 中编码已经有一段时间了。(我倾向于支持的 NASM 对这些事情的困惑要少得多。)