我没有在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指令的信息?
答案 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位寄存器中调用。