ebp und esp



  • Alle x86 ASM Funktionen die ich bis jetzt gesehen habe sehen folgendermaßen aus:

    push ebp
    mov ebp, esp
    ...
    mov esp, ebp
    pop ebp
    ret
    

    Und anschließend benutzt man ebp um auf lokale Variablen zuzugreifen. Wieso macht man das? Könnte man nicht einfach von esp aus zählen und dann hätte man ein Register mehr zur Verfügung für andere Sachen.


  • Mod

    Ben04 schrieb:

    Alle x86 ASM Funktionen die ich bis jetzt gesehen habe sehen folgendermaßen aus:

    push ebp
    mov ebp, esp
    ...
    mov esp, ebp
    pop ebp
    ret
    

    Und anschließend benutzt man ebp um auf lokale Variablen zuzugreifen. Wieso macht man das? Könnte man nicht einfach von esp aus zählen und dann hätte man ein Register mehr zur Verfügung für andere Sachen.

    Ja das kann man tun und in optimiertem Code ist es für gewöhnlich der Fall. Der Verzicht auf einen separaten sog. Framepointer (der (Stack-)Frame einer Funktion ist grob gesagt das Speicherlayout der lokalen Variablen auf dem Stack) erschwert allerdings das Debuggen; mit Framepointer bilden alle Frames eine verkettete Liste, andernfalls ist es jedenfalls für automatisierte Tools in der Regel unmöglich, beim Debuggen den Status lokaler Variablen korrekt zu verfolgen.

    P.S. in Sprachen, die echte lokale Funktionen erlauben, kann man in solchen Funktionen nicht auf den Framepointer verzichten, da dieser benötigt wird, um auf lokale Variablen der aufrufenden Funktion zuzugreifen.



  • ebp ist der "Basepointer", ein Pointer zu lokalen
    Variablen usw.
    Esp ist schon für den Stack in Benutzung...

    Du kannst ebp auch verwenden, musst du nur vorher die register auf den stack pushen.



  • Ok, danke für eure Antworten. 🙂


Anmelden zum Antworten