此指令CALL DWORD PTR [XXXXXXXX]
中的PTR不是多余的。如果指令是CALL DWORD [XXXXXXXX]
这也说,请调用位于地址XXXXXXXX的DWORD长度值。
为什么选择PTR?
答案 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语法相对应的兼容性允许值。