jemand Kann (ListNode PTR [esi]).NextPtr
erklären? Was bedeutet das?
Es bedeutet, dass es ein Zeiger auf den Anfang einer ListNode
Struktur in dem Register ESI
ist. Es dereferenziert diesen Zeiger und wertet das Feld NextPtr
aus.
Es ist im Grunde wie wenn Sie die folgenden in C hatte:
ListNode* esi;
...
return esi->NextPtr;
jemand < Counter, ($ + Counter * SIZEOF ListNode) >
erklären kann? Wie funktioniert es und was bedeutet es?
Nein, ehrlich gesagt kann ich nicht. Tut mir leid, das war eine ziemlich beschissene Antwort. :-)
Ich kann Ihnen sagen, wie ich es herausfinden würde, obwohl. Zuerst würde ich zu the documentation for MASM gehen und sehen, ob ich etwas finden könnte, das relevant aussah. Ich würde finden (oder eigentlich weiß ich schon), dass $
the current value of the location counter bedeutet, und dass SIZEOF
an operator that returns the number of bytes in the specified type ist.
Also dieses Kauderwelsch sieht so aus, als multipliziert es den Wert Counter
mit der Größe der Struktur ListNode
, und fügt dann den aktuellen Wert des Standortzählers hinzu.
Aber ich habe immer noch keine Ahnung was die spitzen Klammern bedeuten. Also würde ich eine Google-Suche versuchen, etwas wie "eckige Klammern MASM". Ich bekomme this question, was nicht sehr nützlich ist, da es keine Antwort hat. In der MASM32-Hilfedatei sehe ich:
Behandelt als eine einzelne literale Zeichenfolge. Bei Makroaufrufen und mit der FOR-Anweisung werden häufig spitze Klammern verwendet, um sicherzustellen, dass Werte in einer Parameterliste als einzelner Parameter behandelt werden. . . Der Assembler entfernt jedes Mal einen Satz spitze Klammern, wenn er ein Argument in eine Makroerweiterung einfügt.
aber das hilft mir auch nicht wirklich zu viel.
Wohin gehen von hier? Nun, angenommen, dass der Code funktioniert, würde ich es zusammenstellen und MASM bitten, eine Listendatei (/Fl
) zu erstellen. Ich würde dann diese Auflistungsdatei untersuchen, um zu sehen, welche Auswirkung dies auf den generierten Code tatsächlich hatte.
Update: Meine Widmung hat sich gelohnt, und ich stieß auf an old manual for MASM 6.1 online. Ich konnte dies in der Online-Dokumentation von Microsoft nicht finden, aber in diesem Handbuch steht eindeutig auf pg. 98:
definieren Struktur und Union Variablen
Sobald Sie eine Struktur oder Union Typ deklariert haben, können Sie Variablen dieses Typs definieren. Für jede definierte Variable wird Speicher im aktuellen Segment in dem vom Typ deklarierten Format zugewiesen. Die Syntax zum Definieren einer Struktur oder einer Vereinigungsvariablen lautet:
[[name]] typename < [[initializer [[,initializer]]...]] >
[[name]] typename { [[initializer [[,initializer]]...]] }
[[name]] typename constant DUP ({ [[initializer [[,initializer]]...]] })
Der Name ist die Beschriftung, die der Variablen zugewiesen ist. Wenn Sie keinen Namen angeben, weist der Assembler Speicherplatz für die Variable zu, gibt ihm jedoch keinen symbolischen Namen. Der Typname ist der Name einer zuvor deklarierten Struktur oder eines Unionstyps.
Sie können für jedes Feld einen Initialisierer angeben. Jeder Initialisierer muss seinem Typ mit dem in der Typdeklaration definierten Feld entsprechen. Für Vereinigungen muss der Typ des Initialisierers mit dem Typ für das erste Feld identisch sein. Eine Initialisierungsliste kann auch den Operator DUP
verwenden.
So sieht es aus wie diese eine unbenannte Variable vom Typ ListNode
erklärt, und das Zeug in Klammern ist die initializer für die ListNode
Struktur, Art wie der C-Code:
Das passt dazu mit dem schwachen Versuch an einem erläuternden Kommentar:
; struct variables Counter, and ($+Counter*SIZEOF ListNode) being declared
seit es die ersten beiden Felder der ListNode
struct, NodeData
und NextPtr
initialisiert, mit diesen Werten.