在此指令中不是PTR冗余:CALL DWORD PTR [XXXXXXXX]

时间:2010-06-21 04:55:59

标签: assembly masm

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

为什么选择PTR?

2 个答案:

答案 0 :(得分:0)

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

如果两个语句都适合你,我可以说是,将它们组合起来并确保它们都生成相同的字节。它们应该是同一个东西,考虑到[xxxxxxxx]中的“xxxxxxxx”定义为一个指针,但是自从我最后一次在MASM中编码以来已经有一段时间了。 (NASM,我倾向于支持,对这类事情的混淆要少得多。)

答案 1 :(得分:0)

在masm的说法中,DWORD PTR是一个指针覆盖,IOW你通常称之为演员。它基本上意味着“将地址XXXXXXXX视为DWORD指针”。

masm实际上键入了它的数据项。因此,如果之前已将XXXXXXXX定义为

XXXXXXXX DWORD SomeAddress   ; Presumably a function entry point.

然后

 CALL XXXXXXXX

就足够了,它将生成与

相同的代码
  CALL DWORD PTR XXXXXXXX

OTOH,如果由于某种原因,XXXXXXXX被定义为

XXXXXXXX  WORD ?
          WORD ?

然后让MASM组装对XXXXXXXX的调用而不会产生mams错误的唯一方法是

  CALL DWORD PTR XXXXXXXX

在这种情况下,方括号[]不会给盘子带任何东西,BTW。对于其他一些汇编程序,它们表示间接。在上面的例子中,masm不需要它们。在其他上下文(基数+索引表达式)中,它们用于括起索引寄存器和/或值。

哦,顺便说一下:

  CALL DWORD [XXXXXXXX]

今天是一个不寻常的masm语法(每个masm 6文档书籍及其示例),并且可能是与一些较旧的masm语法相对应的兼容性允许值。