Warum ist der Basepointer so wichtig?
-
Hi,
also in fast allen Linux (oder auch Win?) Assembler Tutorials liest man immer folgenden Code (was bei Linux-Programmen immer automatisch auftritt):pushl %ebp movl %esp, %ebp
Aber warum ist das so wichtig?
Wenn ich hier nun mit push/pop arbeiten würde, würde ich den Basepointer ja nicht überschreiben!
Das könnte höchstens dann passieren, wenn ich einmal zuviel poppe (:D)
Oder nicht?
-
Richtig, guck dir mal die Option -fomit-frame-pointer (GCC) an ...
-
Ehrlich, das ist alles?
Irgendwie ist mir das aber trotzdem noch nicht so klar.
Könntet ihr mir so ein kleines ASCII Diagramm zeigen?
So wie, z.B.
---
var1
---
eip
---
ebpusw.
Also was vor der Speicherung und danach passiert.P.S.
Ach ja genau.
Und wenn ich halt dieses fomit-frame-pointer reinhaue oder die oben genannte Technik benutze, dann kann ich doch trotzdem den alten Basepointer überschreiben, oder?
Einfach noch mal poppen (:D) und dann ist der doch wieder im A*sch!?
-
Ich versteh die Frage nicht. Wenn du weißt wie push und pop funktionieren, wirst du's hoffentlich selbst schaffen, die entsprechenden Diagramme zu malen.
-
Ich weiß nicht ob ich deine Frage richtig verstanden habe, also hier mal ein paar allgemeine Erklärungen:
EBP wird für den Stackframe benutzt. Wenn du mit EBP addressiert, dann benutzt du SS. EBP wird von anderen Funktionen nicht zerstört (bzw es sollte nicht zerstört werden
).
Du benutzt dann in der Funktion EBP um auf Parameter und lokale Variablen zuzugreifen. ESP direkt zu benutzen ist meist schlecht. Stell dir folgenden Code vor:mov eax,[esp+4] ; 1. parameter nach EAX cmp eax,1 jz label1 add eax,5 push eax ; ESP -= 4 label1:
Hiernach hat sich ESP vielleicht verändert. Wir wissen also nicht ob sich der zweite Parameter bei [ESP+4] oder bei [ESP+8] befindet. Deshalb nimmt man EBP zur Addressierung auf dem Stack.
Wenn du tatsächlich jedesmal beim Adressieren via EBP vorher PUSH EBP und danach POP EBP aufrufst, dann wird dann Programm größer und langsamer.
Schau dir am besten auch mal die Instruktionen ENTER und LEAVE an. Die sind zur Handhabung eines Stackframes ein wenig automatischer.
Keine Ahnung ob dir das irgendwie hilft. Wie gesagt, ich habe deine Frage nicht 100%ig verstanden.