1

这条指令中的 PTR 不是多余的 CALL DWORD PTR [XXXXXXXX]。如果指令是CALL DWORD [XXXXXXXX]这也说,调用位于地址 XXXXXXXXX 的 DWORD 长度值。

那为什么要PTR?

4

2 回答 2

0

在 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 语法相对应的兼容性允许。

于 2010-06-22T09:24:20.833 回答
0

如果我没记错的话,“PTR”运算符就在那里,因为在 MASM 中,有时您可以拥有一个看起来像常规值但实际上是指针的表达式。

如果这两个语句都对您有用,我只能说,将它们组合起来并确保它们都生成相同的字节。它们应该是一样的,考虑到“xxxxxxxx”在[xxxxxxxx]定义上是一个指针,但是自从我上次在 MASM 中编码已经有一段时间了。(我倾向于支持的 NASM 对这些事情的困惑要少得多。)

于 2010-06-21T05:28:48.413 回答