2017-02-10 1 views
0

J'ai remarqué que l'utilisation de TYPEDEF pour définir des PTR avec différents types de données ne semble pas faire de différence. Par exemple, ces trois types semblent se comporter exactement la même que celle utilisée pour stocker et mov adresses 32 bits:TYPEDEF PTR - la taille n'a pas d'importance?

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 

Y at-il une raison pratique de spécifier une taille autre que c'est plus autodocumenté?

+0

n'avez-vous pas posé cette question? il indique à l'assembleur quelle instruction générer. Veuillez lire la documentation d'Intel avant de poser à nouveau cette question. –

+0

quelqu'un vient de poser cette question cette semaine ... –

+0

Veuillez inclure l'instruction MASM _exact_ dans laquelle ces trois directives semblent se comporter de la même manière! – zx485

Répondre

1

La déclaration et l'utilisation de types de pointeurs ont peu d'utilité dans MASM. Les types dans MASM ne sont essentiellement que des tailles et ne sont utilisés que pour déterminer la taille des objets et des opérandes et leur compatibilité en termes de taille. Si vous créez un fichier de liste lors de l'assemblage de votre code d'exemple (après avoir ajouté .MODEL FLAT et END directives afin qu'il rassemble), vous verrez que le type de ptr1, ptr2 et ptr3 sont tous 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 

La seule chose Je peux voir les types de pointeurs à propos qui pourraient les rendre utiles est le fait qu'ils changeront automatiquement de taille en fonction du modèle de mémoire en vigueur. Donc vous si vous assemblez votre exemple avec .MODEL SMALL au lieu de .MODEL FLAT les types de ptr1, ptr2 et ptr3 deviennent WORD au lieu de DWORD. De même, si vous supprimez la directive model et l'assemblez avec la version x64 de MASM, les types de ces symboles deviennent QWORD. Toutefois, si vous faites l'une ou l'autre de ces choses, cela n'est pas aussi utile que cela en a l'air, car les instructions MOV EAX, ... dans votre exemple de code généreront alors des erreurs en raison de la différence de taille d'opérande. En pratique, beaucoup d'autres codes doivent encore être réécrits pour s'adapter à la modification de la taille du pointeur.

Une autre possibilité est que les types de pointeurs seraient en quelque sorte utilisés dans les macros pour faire quelque chose d'utile, mais je ne peux pas vraiment voir ce que ce serait. Même en tant que documentation, l'utilisation des types de pointeurs est douteuse, car les autres lecteurs ne sauront pas ce que PBYTE ou PTYPE veulent dire sans chercher dans le code pour leur définition. Je ne recommanderais pas de les utiliser.

+0

Je suppose que l'auto-document est le seul véritable but utile alors? – cafekaze