Verstehe Assembler-Code nicht

Hi Leute,

im Moment versuche ich, mir etwas Assembler anzueignen. Beim Durcharbeiten von einigen Tutorials, Beispielcodes und Dokus stieß ich auf diesen Code:


push eax ; zweiter Parameter fuer f1
push ebx ; erster Parameter fuer f1
call f1
add esp,8 ; Parameter vom Stack entfernen

f1: push ebp
mov ebp,esp

mov ebx,[ebp+8] ; 1. Parameter in ebx laden
mov eax,[ebp+12] ; 2. Parameter in eax laden

pop ebp
ret

Bisher hab ich die Abläufe einigermaßen verstanden, aber hier hakts jetzt etwas an meinem Verständnis, deshalb wollte ich fragen, ob sich jemand bereiterklären würde, mir diesen Codes etwas genauer zu erklären. Mein Hauptproblem liegt darin, dass ich nicht verstehe, wieso an bestimmten Stellen bestimmte Register angesprochen werden.

Liebe Grüße
Woosh

Ich weiß nicht ganz genau was du nicht verstehst. Probiere aber trotzdem mal das weiter zu erklären. Ich gehe davon aus, dass sich dein Code auf einen x86 bezieht. Zu Beachten ist, dass hier der Stack richtung kleinerer Adressen wächst.

Der Code ruft eine Funktion f1 auf. Die Parameter liegen vor Ausführung des Codes in eax und ebx. Eine Erklärung zu push und pop habe ich auf http://www.activevb.de/tutorials/tut_asm/asm2.html gefunden (ich komme immer durcheinander mit der Reinfolge von Dekrementieren und kopieren).

push eax ; zweiter Parameter fuer f1
push ebx ; erster Parameter fuer f1

Push subtrahiert vom Stackzeiger (ESP) um 4 (Größe von den Registern) und kopiert anschließend den Weg an die Stelle von ESP. Damit zeigt nach der Ausführung ESP auf eine Speicherzelle, die den Wert von EBX enthält und ESP+4 auf eine Speicherzelle von EAX.

call f1

hier wird dann doch die Adresse des darauffolgenden Befehls auf den Stack gesichert: ESP wird um 4 erniedrigt und die Adresse des dem call folgendem Befehls (hier add) abgelegt. Bei dem Return unten wird der Wert wieder um 4 erhöht. Damit hat ESP vor dem Add den gleichen Wert wie vor dem call.

add esp,8 ; Parameter vom Stack entfernen

Die 8 ist die Summe der beiden Push-Befehle. Damit hat nach dem add ESP den gleichen Wert, wie vor dem ersten push.

f1: push ebp

Nach diesem Push zeigt ESP auf den Wert von dem Wert von EBP, ESP+4 auf die Rücksprungadresse, ESP+8 auf den oben angegeben Wert von EBX und ESP+12 auf den oben angegebenen Wert von EAX.

mov ebp,esp

Da sich der Stackpointer beim Programmlauf häufiger ändern könnte, wird statt dessen der Wert in EBP verwendet. Soweit ich weiß, könnte man inzwischen auch direkt ESP für die Adressierung verwenden alte Prozessoren haben dies aber nicht unterstützt (vor 386 oder vor 286).


mov ebx,[ebp+8] ; 1. Parameter in ebx laden
mov eax,[ebp+12] ; 2. Parameter in eax laden

pop ebp

Alten EBP wiederherstellen. Da jede Funktion immer den alten Wert herstellen muss, kann man so auch einfach rekursive Funktionen bauen (jede Funktion würde erneut EBP sichern und entsprechend laden.

ret

zürück zum Aufrufer: Forsetzen an der Stelle, wo ESP draufzeigt und anschließend ESP um 4 erhöhen.

Vielen Dank für deine Hilfe, endlich hab ichs verstanden! :smile: