2017-02-10 3 views
0

Ich bemerkte, TYPEDEF zu verwenden, um PTRs mit verschiedenen Datentypen zu definieren, scheint keinen Unterschied zu machen. Zum Beispiel scheinen diese drei Typen genau gleich verhalten, wenn zum Speichern und mov 32-Bit-Adressen:TYPEDEF PTR - Größe spielt keine Rolle?

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 

Gibt es einen praktischen Grund, eine andere Größe als es ist mehr selbsterklärend angeben?

+0

hast du diese Frage nicht gestellt? Es teilt dem Assembler mit, welche Anweisung generiert werden soll. Bitte lesen Sie die intel-Dokumentation, bevor Sie diese Frage erneut stellen. –

+0

jemand hat das gerade diese Woche gefragt ... –

+0

Bitte fügen Sie die _exact MASM-Anweisung_, in der diese drei Direktiven scheinen sich auf die gleiche Weise zu verhalten! – zx485

Antwort

1

Die Deklaration und Verwendung von Zeigertypen hat wenig Nutzen in MASM. Typen in MASM sind im Grunde genommen nur Größen und dienen nur dazu, Größen von Objekten und Operanden und deren Kompatibilität in der Größe zu bestimmen. Wenn Sie eine Listendatei erzeugen, während die Beispielcode Montage (nach der Zugabe von .MODEL FLAT und END Richtlinien, damit es montiert), werden Sie sehen, dass die Art der ptr1, ptr2 und ptr3 sind alle 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 

Das einzige, was Ich kann die ungefähren Zeigertypen sehen, die sie nützlich machen, ist die Tatsache, dass sie sich automatisch in der Größe entsprechend dem Speichermodell ändern, das in Kraft ist. Wenn Sie also Ihr Beispiel mit .MODEL SMALL anstelle von .MODEL FLAT zusammenbauen, werden die Typen ptr1, ptr2 und ptr3 WORD anstelle von DWORD. Wenn Sie die Modellanweisung löschen und sie mit der x64-Version von MASM zusammensetzen, werden die Typen dieser Symbole zu QWORD. Wenn Sie jedoch eines dieser Dinge tun, wird Ihnen klar, dass es nicht so nützlich ist, wie es sich anhört, denn die Anweisungen in Ihrem Beispielcode erzeugen dann Fehler, weil die Operandengröße nicht übereinstimmt. In der Praxis müsste noch viel anderer Code neu geschrieben werden, um ihn an die Änderung der Zeigergröße anzupassen.

Eine andere Möglichkeit ist, dass die Zeigertypen irgendwie in Makros verwendet werden, um etwas Nützliches zu tun, aber ich kann nicht wirklich sehen, was das wäre. Auch als Dokumentation ist die Verwendung der Zeigertypen zweifelhaft, da andere Leser nicht wissen, was PBYTE oder PTYPE bedeuten, ohne den Code nach ihrer Definition zu durchsuchen. Ich würde nicht empfehlen, sie zu benutzen.

+0

Ich denke, die Selbst-Dokumentation ist dann der einzige wirkliche nützliche Zweck? – cafekaze

Verwandte Themen