AT&T Assembler-Syntax
-
Was macht das folgende ASM-Snippet?
jmp *offset(%ebx) pushl #index jmp first_plt_entry
Genaugenommen verstehe ich nur die Syntax des ersten Sprung-Befehls nicht. Der zweite Sprungbefehl ist klar und bei "pushl #index" wird wohl die Adresse von "index" auf den Stack gelegt, oder?
Gibt es irgendwo eine Kurzreferenz wo diese Syntax kurz & knapp erklärt wird?
-
Hier z.B. eine schöne Übersicht http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gnu-assembler/index.html
Siehe dort Kapitel "21. 80386 Dependent Features".
Die Zeile *jmp offset(%ebx) kann man sich u.a. so vorstellen, dass man einen Pointer hat, der die Zieladresse spezifiziert, auf die gesprungen wird. Entspricht ungefähr folgendem Code (der wahrscheinlich nur von gcc compilierbar ist):int FuncB(void) { void *Location = &&Ende; goto *Location; Ende: return 0; }
Pointer Location enthält die Adresse von der Sprungmarke Ende und mit goto wird dorthin gesprungen. Auf den ersten Blick ein schönes Feature von gcc, weil es hackermässig aussieht, aber man sollte am Besten die Finger davon lassen...
-
Warum schreibst du &&Ende? Ist nicht &Ende die Adresse an der das Label steht, oder ist hier && eine spezielle Syntax um die Adresse des Labels zu speichern?
-
Weil es so im gcc Manual steht:
You can get the address of a label defined in the current function (or a containing function) with the unary operator ‘&&’. The value has type void *.
Und wenn man versucht mit einem & zu kompilieren, kommt eine Fehlermeldung:
funcB1.c: In function
FuncB': funcB1.c:4: error:
Ende' undeclared (first use in this function)
funcB1.c:4: error: (Each undeclared identifier is reported only once
funcB1.c:4: error: for each function it appears in.)Übrigens, wegen der Zeile pushl #index mit dem Zeichen #. Das Zeichen kenne ich so nicht. Wenn, dann $:
pushl $index # push Adresse von index pushl index # push Inhalt von index (42) ... .section .data index: .long 42