使用MASM时在CALL指令中使用PTR有疑问

时间:2019-05-09 05:34:39

标签: masm

我没有在MASM的文档中看到本示例中使用的有关PTR寄存器的信息:

.486

.Model flat,stdcall

label1 typedef ptr proc

.data

   mydata db 20h

.code

main proc

   call label1 ptr esi

main endp

end

使用PTR寄存器在哪里可以找到有关CALL指令的信息?

1 个答案:

答案 0 :(得分:0)

PTR不是寄存器。 PTR是MASM语法元素,是“指针”的简写,并且是一种强制转换运算符。因此,例如mov DWORD PTR [esi], 0的意思是“处理地址esi指向DWORD(32位),然后在其中复制零”,因此清除了4个字节。相反,mov BYTE PTR [esi], 0意味着只清除1个字节。

在您的示例中,label1被定义为表示“过程指针”的类型。在CALL指令中,PTR用来告诉汇编器地址esi指向的类型为“过程”。 CALL指令调用该过程,该过程的地址存储在ESI中。

据我所知,此强制转换在此示例中是没有用的,因为强制转换无需解决歧义:CALL具有32位寄存器操作数始终是间接的近距离调用,采用地址从32位寄存器中调用。