TYPEDEF PTR - 大小无关紧要?

TYPEDEF PTR - size doesn't matter?

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

除了更易于自我记录之外,是否有任何实际原因需要指定一个大小?

声明和使用指针类型在 MASM 中用处不大。 MASM 中的类型基本上只是大小,仅用于确定对象和操作数的大小及其兼容性 size-wise。如果您在汇编示例代码时生成列表文件(在添加 .MODEL FLATEND 指令后,它会 assembles),您将看到 ptr1 的类型, ptr2ptr3 都是 DWORD:

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

关于指针类型,我能看到的唯一可能使它们有用的是它们会根据有效的内存模型自动改变大小。因此,如果您 assemble 您的示例使用 .MODEL SMALL 而不是 .MODEL FLAT,则 ptr1ptr2ptr3 的类型将变为 WORD 而不是 DWORD。同样,如果您使用 x64 版本的 MASM 删除模型指令和 assemble,这些符号的类型将变为 QWORD。然而,做这些事情中的任何一个都会表明它并不像听起来那么有用,因为示例代码中的 MOV EAX, ... 指令随后会由于操作数大小不匹配而产生错误。实际上,许多其他代码仍需要重写以适应指针大小的变化。

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