Assembler - CALL beeinträchtigt Stapelspeicher
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
ablegen
angegebenen adresse
aufruf
befehl
code
durchlesen
folgendes versuche
http
machen
parameter
pop
programm
prozedur
register
stapel
url
variablen abholen
vorschein
zahl
zeiger
-
Ich habe die Erfahrung gemacht, dass der
Befehl den Stapel beeinflusst. Lege ich beispielsweise eine Zahl darauf ab, rufe eine Prozedur auf und versuche dann in derselben die Zahl vom Stapel zu erhalten, kommt eine andere Zahl zum Vorschein:CALL
Hier ist das Register verschieden von 15, im Gegensatz zu:mov ecx,15 push ecx CALL prozedur ; ... prozedur: pop ecx cmp ecx,15 ; ... ret
Denn hier ist das Register gleich 15.mov ecx,15 push ecx JMP prozedur ; ... prozedur: pop ecx cmp ecx,15
Durch etwas Lektüre weiß ich, dass je nach Kontext durch den
Befehl der Befehlszeiger und manchmal auch das Codesegment auf den (?) Stapel gelegt werden, wenn ich jedoch folgendes versuche bricht das Programm ab:CALL
mov ecx,15 push ecx call prozedur ; ... prozedur: pop si pop ecx push si cmp ecx,15 ; ... ret
Mir ist immernoch unklar, inwiefern der
Aufruf Einfluss auf den Stapelspeicher nehmen kann, oder ob es dafür einen eigenständigen Befehlsstapel gibt. Und wenn tatsächlich einfach der Befehlszeiger auf den Stapel geschmissen wird, wie kann ich ihn behutsam zwischenspeichern, meine Variablen abholen und den Zeiger dann wieder ablegen?CALL
Beitrag zuletzt geändert: 7.1.2013 21:23:13 von toolz -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Der Befehl
legt den Befehlszeiger (call
-Register) auf den Stack und springt dann zur angegebenen Adresse.IP
macht genau das gegenteil, holt also den Befehlszeiger vom Stack.ret
Am einfachsten kannst du auf deine Variablen zugreifen, indem du von
aus relativ adressierst… dazu pushst du zuerstesp
auf den Stack um dort den Stackpointer hinkopieren zu können. Danach greifst du mittelsebp
auf die Werte zu.[ebp-offset]
Also ungefähr so:push ebp ; ebp sichern mov ebp,esp ; esp zugänglich machen ; [ebp] = alter ebp ; [ebp-4] = Return-Adresse ; [ebp-8] = 1. Parameter (dword) push eax mov eax,[ebp-8] ; 1. Parameter nach eax laden ; irgendwas damit anfangen pop eax pop ebp ; ebp zurücksetzen
Eventuell noch das durchlesen… -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage