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 FLAT
和 END
指令后,它会 assembles),您将看到 ptr1
的类型, ptr2
和 ptr3
都是 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
,则 ptr1
、ptr2
和 ptr3
的类型将变为 WORD 而不是 DWORD。同样,如果您使用 x64 版本的 MASM 删除模型指令和 assemble,这些符号的类型将变为 QWORD。然而,做这些事情中的任何一个都会表明它并不像听起来那么有用,因为示例代码中的 MOV EAX, ...
指令随后会由于操作数大小不匹配而产生错误。实际上,许多其他代码仍需要重写以适应指针大小的变化。
另一种可能性是指针类型会以某种方式在宏中使用来做一些有用的事情,但我真的看不出那会是什么。即使作为文档,使用指针类型也是可疑的,因为如果不在代码中搜索它们的定义,其他读者不会知道 PBYTE
或 PTYPE
的含义。我不建议使用它们。
我注意到使用 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 FLAT
和 END
指令后,它会 assembles),您将看到 ptr1
的类型, ptr2
和 ptr3
都是 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
,则 ptr1
、ptr2
和 ptr3
的类型将变为 WORD 而不是 DWORD。同样,如果您使用 x64 版本的 MASM 删除模型指令和 assemble,这些符号的类型将变为 QWORD。然而,做这些事情中的任何一个都会表明它并不像听起来那么有用,因为示例代码中的 MOV EAX, ...
指令随后会由于操作数大小不匹配而产生错误。实际上,许多其他代码仍需要重写以适应指针大小的变化。
另一种可能性是指针类型会以某种方式在宏中使用来做一些有用的事情,但我真的看不出那会是什么。即使作为文档,使用指针类型也是可疑的,因为如果不在代码中搜索它们的定义,其他读者不会知道 PBYTE
或 PTYPE
的含义。我不建议使用它们。