Post by Jens KallupHallo Bernhard,
schön, das wieder ein bisschen Leben hier ist ... :-)
Hallo Jens,
in den englischsprachigen Assembler-Foren wird momentan nicht
besonders viel diskutiert, das mich wirklich interessiert, da
bleibt genug Zeit für die "de-class"... ;)
Post by Jens KallupPost by Bernhard SchornakPost by Jens Kallupgibt es da was zu beachten (Parameter, call convention (C/c++), etc...)???
In deutscher Sprache sind relativ wenig Dokumente verfügbar.
Ich kann die Grundlagen aber in Kurzform posten, wenn Du uns
mitteilst, ob es um Linux oder Windows geht.
Eigentlich um beide, aber vorrangig Linux.
Windows:
Parameterübergabe in RCX, RDX, R8 und R9, respektive XMM0 bis
XMM3. Bei gemischten Parametern - Ganzzahl oder Fliesskomma -
das jeweils zutreffende GPR- oder XMM-Register in der angege-
benen Reihenfolge, z.B. XMM0, RDX,R8, XMM3.
Müssen mehr als vier Parameter übergeben werden, werden diese
auf dem Stapel ab 0x20[RSP] (aufwärts) abgelegt. Den darunter
liegenden Stapelbereich 0x00[RSP] - 0x1F[RSP] nennt Microsoft
"Schattenraum", er gehört der aufgerufenen Funktion, die dort
ihre Daten ablegen darf (was gegebenenfalls das Anlegen eines
Stapelrahmens erspart).
Die Register R10, R11, XMM4 und XMM5 sind laut Definition als
"volatile" deklariert, ihr Inhalt kann von der -aufgerufenen-
Funktion also überschrieben werden.
Rückgabewerte generell in RAX, Fliesskommawerte in XMM0.
Linux:
Parameterübergabe - Ganzzahlen in RDI, RSI, RDX, RCX, R8, R9,
Fliesskommazahlen in XMM0 - XMM7. Reichen die sechs oder acht
Parameter nicht aus, ist der Rest auf dem Stapel ab 0x00[RSP]
(aufwärts) abzulegen. Anders als bei Windows spielt dabei die
Reihenfolge keine Rolle. Aus der oben angegebenen Reihenfolge
würde für Linux also XMM0, RDI, RSI, XMM1.
Linux hat keinen Schattenraum, das heißt, dass der Stapel wie
beim 32 Bit ABI bei 0x00[RSP] losgeht. Dafür gibt's eine rote
Zone, die zwischen-0x08[RSP] und -0x80[RSP] liegt. Diese rote
Zone ist obligatorisch und muss von der aufgerufenen Funktion
(für was auch immer...) angelegt werden.
Die Register R10, R11 und XMM8 bis XMM15 sind laut Definition
"volatile", ihr Inhalt darf von der aufgerufenen Funktion je-
derzeit überschrieben werden.
Die Rückgabe erfolgt analog zu Windows.
Generell gilt, dass man den Stapel als durchgehende Folge von
64 Bit breiten Elementen (qwords) ansehen sollte, da RSP beim
Ausführen von Call, PUSH und POP acht Byte inkrementiert oder
dekrementiert wird. Des weiteren muss der Stapel generell auf
einer durch 16 teilbaren Adresse liegen.
In meinem Blog finden sich vertiefende Informationen über den
Stapel und Programmbeispiele für 64 Bit Windows (momentan nur
in englischer Sprache):
http://st-intelligentdesign.blogspot.de/
Schönes Wochenende
Bernhard Schornak