我注意到使用TYPEDEF来定义具有各种数据类型的PTR并不会产生任何不同。例如,当用于存储和mov
32位地址时,这三种类型的行为似乎完全相同:
PTYPE TYPEDEF PTR
PBYTE TYPEDEF PTR BYTE
PWORD TYPEDEF PTR WORD
.data
arrayByte BYTE 10h,20h,30h
ptr_1 PTYPE arrayByte
ptr_2 PBYTE arrayByte
ptr_3 PWORD arrayByte
.code
main PROC
mov eax, ptr_1
mov eax, ptr_2
mov eax, ptr_3
exit
main ENDP
是否有任何实际的理由来指定除了更自我记录之外的尺寸?
答案 0 :(得分:1)
声明和使用指针类型在MASM中几乎没有用处。 MASM中的类型基本上只是大小,仅用于确定对象和操作数的大小以及它们在大小方面的兼容性。如果在汇编示例代码时生成列表文件(在添加.MODEL FLAT
和END
指令以便它组装之后),您将看到ptr1
的类型,{{1 }和ptr2
都是DWORD:
ptr3
我唯一能看到可能使它们变得有用的指针类型的事实是它们会根据有效的内存模型自动改变大小。因此,如果您使用Types:
N a m e Size Attr
PBYTE . . . . . . . . . . . . . 00000004 Near32 PTR Byte
PTYPE . . . . . . . . . . . . . 00000004 Near32 PTR
PWORD . . . . . . . . . . . . . 00000004 Near32 PTR Word
...
Symbols:
N a m e Type Value Attr
...
ptr_1 . . . . . . . . . . . . . DWord 00000003 _DATA
ptr_2 . . . . . . . . . . . . . DWord 00000007 _DATA
ptr_3 . . . . . . . . . . . . . DWord 0000000B _DATA
而不是.MODEL SMALL
汇总示例,则.MODEL FLAT
,ptr1
和ptr2
的类型将变为WORD而不是DWORD。类似地,如果删除模型指令并将其与x64版本的MASM组合在一起,则这些符号的类型将变为QWORD。但是,执行这些操作中的任何一个都会发现它没有听起来那么有用,因为示例代码中的ptr3
指令会因操作数大小不匹配而产生错误。在实践中,仍然需要重写许多其他代码以适应指针大小的变化。
另一种可能性是指针类型会以某种方式在宏中用来做一些有用的事情,但我无法真正看到它会是什么。即使作为文档,使用指针类型也是可疑的,因为其他读者不知道MOV EAX, ...
或PBYTE
的含义,而无需在代码中搜索其定义。我不建议使用它们。