2017-05-06 7 views
2

Das folgende ist eine verknüpfte Liste Assembly-Programm in Kip Irvine Assembly Language x86 Buch gefunden. In main durchläuft eine Schleife die Liste und zeigt alle Knotenwerte an. Anstatt einen festen Zähler für die Schleife zu verwenden, sucht das Programm nach dem Nullzeiger im Endknoten und stoppt die Schleife, wenn es gefunden wird. Meine Frage ist folgende:LinkedList in Assembly x86 Irvine

(a) Kann jemand erklären < Counter, ($ + Counter * SIZEOF ListNode)>? Wie funktioniert es und was bedeutet es?

(b) Kann jemand erklären (ListNode PTR [esi]). NextPtr? Was bedeutet das?

INCLUDE Irvine32.inc 

    ListNode STRUCT 
    NodeData DWORD ? 
    NextPtr DWORD ? 
    ListNode ENDS 
    TotalNodeCount = 15 
    NULL = 0 
    Counter = 0 

.data 

    putc  macro ptr 

    push eax 

    mov  al, ptr 
    call writechar 

    pop  eax 
    endm 

    ;to use:    
    ;putc  'a' 



    LinkedList LABEL PTR ListNode 

REPEAT TotalNodeCount 
    Counter = Counter + 1 
    ListNode <Counter, ($ + Counter * SIZEOF ListNode)> 
    ;struct variables Counter, and ($+Counter*SIZEOF ListNode) being declared 
    ; 
    ENDM 

    ListNode <0,0> ; tail node 

.code 

main PROC 
    mov esi,OFFSET LinkedList 
    ; Display the integers in the NodeData fields. 
    NextNode: 
    ; Check for the tail node. 

    putc 'a'; ->first node, then third node 

    mov eax,(ListNode PTR [esi]).NextPtr 
    cmp eax,NULL 
    je quit 
    ; Display the node data. 

    putc 'b' ;->fourth node 

    mov eax,(ListNode PTR [esi]).NodeData 
    call WriteDec 
    call Crlf 
    ; Get pointer to next node. 

    putc 'c' ;->first node 
    putc 'd' ;->second node 
    mov esi,(ListNode PTR [esi]).NextPtr 
    ;references a struct using [esi] 
    jmp NextNode 
    quit: 


    exit 
main ENDP 
END main 

Antwort

1

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 SIZEOFan 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.