TYPEDEF PTR - 尺寸并不重要?

时间:2017-02-10 14:45:29

标签: assembly masm

我注意到使用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

是否有任何实际的理由来指定除了更自我记录之外的尺寸?

1 个答案:

答案 0 :(得分:1)

声明和使用指针类型在MASM中几乎没有用处。 MASM中的类型基本上只是大小,仅用于确定对象和操作数的大小以及它们在大小方面的兼容性。如果在汇编示例代码时生成列表文件(在添加.MODEL FLATEND指令以便它组装之后),您将看到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 FLATptr1ptr2的类型将变为WORD而不是DWORD。类似地,如果删除模型指令并将其与x64版本的MASM组合在一起,则这些符号的类型将变为QWORD。但是,执行这些操作中的任何一个都会发现它没有听起来那么有用,因为示例代码中的ptr3指令会因操作数大小不匹配而产生错误。在实践中,仍然需要重写许多其他代码以适应指针大小的变化。

另一种可能性是指针类型会以某种方式在宏中用来做一些有用的事情,但我无法真正看到它会是什么。即使作为文档,使用指针类型也是可疑的,因为其他读者不知道MOV EAX, ...PBYTE的含义,而无需在代码中搜索其定义。我不建议使用它们。