TYPEDEF PTR - size doesn't matter?

走远了吗. 提交于 2019-12-08 12:30:50

问题


I noticed using TYPEDEF to define PTR's with various data types doesn't seem to make any difference. For example, these three types seem to behave exactly the same when used to store and mov 32-bit addresses:

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

Is there any practical reason to specify a size other than it's more self-documenting?


回答1:


Declaring and using pointer types has little use in MASM. Types in MASM basically are just sizes and are only to used determine sizes of objects and operands and their compatibility size-wise. If you generate a listing file while assembling your example code (after adding .MODEL FLAT and END directives so it assembles), you'll see that the type of ptr1, ptr2 and ptr3 are all 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

The only thing I can see the about pointer types that might make them useful is the fact that they'll automatically change in size according to the memory model in force. So you if you assemble your example with .MODEL SMALL instead of .MODEL FLAT the types of ptr1, ptr2 and ptr3 become WORD instead of DWORD. Similarly if you delete the model directive and assemble it with the x64 version of MASM the types of those symbols becomes QWORD. However doing either of these things reveals that it's not as useful as it sounds, because the MOV EAX, ... instructions in your example code will then generate errors because of the operand size mismatch. In practice a lot of other code would still need to be rewritten to adjust to the change in pointer size.

Another possibility is that the pointer types would somehow be used in macros to do something useful, but I can't really see what that would be. Even as documentation, using the pointer types is dubious, as other readers aren't going to know what PBYTE or PTYPE mean without searching through the code for their definition. I wouldn't recommend using them.



来源:https://stackoverflow.com/questions/42162140/typedef-ptr-size-doesnt-matter

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!