2017-02-10 29 views
0

Я заметил использование TYPEDEF для определения PTR с различными типами данных, похоже, не имеет никакого значения. Например, эти три типа, кажется, ведет себя точно так же, когда используется для хранения и mov 32-разрядных адресов:TYPEDEF PTR - размер не имеет значения?

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

разве вы не задали этот вопрос? он сообщает ассемблеру, какую команду генерировать. прочитайте документацию Intel, прежде чем снова задавать этот вопрос. –

+0

кто-то просто спросил об этом на этой неделе ... –

+0

Пожалуйста, укажите _exact инструкцию MASM_, в которой эти три директивы, похоже, ведут себя одинаково! – zx485

ответ

1

Объявление и использование типов указателей мало используются в MASM. Типы в MASM в основном являются только размерами и используются только для определения размеров объектов и операндов и их совместимости по размеру. Если вы генерируете листинг файла при сборке пример кода (после добавления .MODEL FLAT и END директивы так компонует), вы увидите, что тип 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 

Единственное Я вижу, что типы указателей, которые могут сделать их полезными, - это тот факт, что они будут автоматически изменяться в зависимости от модели памяти. Итак, если вы соберете свой пример с .MODEL SMALL вместо .MODEL FLAT, то типы ptr1, ptr2 и ptr3 станут СЛОВО вместо DWORD. Аналогично, если вы удалите директиву модели и соберите ее с x64-версией MASM, типы этих символов станут QWORD. Однако выполнение любой из этих вещей показывает, что это не так полезно, как кажется, потому что команды MOV EAX, ... в вашем примере кода будут генерировать ошибки из-за несоответствия размера операнда. На практике много другого кода нужно будет переписать, чтобы приспособиться к изменению размера указателя.

Другая возможность заключается в том, что типы указателей каким-то образом будут использоваться в макросах, чтобы сделать что-то полезное, но я не могу понять, что это будет. Даже в том, что касается документации, использование типов указателей сомнительно, так как другие читатели не будут знать, что означает PBYTE или PTYPE, не просматривая код для определения. Я бы не рекомендовал их использовать.

+0

Я полагаю, что самодокументирование - единственная реальная полезная цель? – cafekaze