2010-09-03 9 views
37

ich benutzte stapel in montage aber ich hatte keine idee über push ebp und pop ebp.erklärung über push ebp und pop ebp anweisung in assembly

.intel_syntax noprefix 

.include "console.i" 

.text 

askl: .asciz "Enter length: " 
askb: .asciz "Enter breadth: " 
ans: .asciz "Perimeter = " 

_entry: 

    push ebp  # establishing stack-frame 
    mov ebp, esp 
    sub esp, 12 

    Prompt askl 
    GetInt [ebp-4]  # length 
    Prompt askb 
    GetInt [ebp-8]  # breadth 

    mov eax, [ebp-4] # eax = l 
    add eax, [ebp-8] # eax = l + b 
    add eax, eax # eax = 2 * (l + b) 
    mov [ebp-12], eax 

    Prompt ans 
    PutInt [ebp-12] 
    PutEoL 

    mov esp, ebp 
    pop ebp  # unwinding stack-frame 
    ret 

.global _entry 

.end 
+1

Warum posten Sie den ganzen Code, wenn Sie Zweifel mit nur 6 Zeilen haben? – Searock

+8

Es ist immer am besten, mehr Kontext als weniger zu geben. Das heißt, die eigentliche Frage ist sehr vage und würde einige weitere Erklärungen verwenden. –

Antwort

58

Ich bin mir nicht sicher, ob dies Ihre Zweifel ist, aber vielleicht darüber Sie sich fragen:

push ebp 
mov ebp, esp 
sub esp, 12 

Die ersten 2 Zeilen als Prolog Montagefunktion wissen werden. Es speichert den vorherigen Basiszeiger (ebp) und legt den Basiszeiger so fest, wie er sich am Anfang des Stapels befand. Dies bedeutet, dass der gesamte Stapelinhalt auf dem Stapel gespeichert wird, sodass die Funktion den Stapel verschieben/verschieben kann.

Die Zeile sub esp,12 spart Platz für lokale Variablen in der Funktion.

Am Ende haben Sie:

mov esp, ebp 
pop ebp 
ret 

Dies ist die Umkehrung der Prolog der Fall ist, so kann der vorherige Kontext wiederhergestellt werden.

Sind das Ihre Zweifel? :)

+5

Beachten Sie auch, dass Sie eine Anweisung namens 'leave' haben, die genau das ist, was' mov esp, ebp' und 'pop ebp' tut. – jyz

37

ebp wird als der Basiszeiger oder dem Rahmenzeiger bekannt. Beim Zugriff auf Ihre Funktion drücken Sie sie (um den Wert für die aufrufende Funktion zu speichern). Dann kopieren Sie den Stack-Zeiger esp in ebp, sodass ebp jetzt auf den Stack-Frame Ihrer Funktion zeigt. Am Ende Ihrer Funktion geben Sie dann ebp ein, damit der Wert der aufrufenden Funktion wiederhergestellt wird.

Für etwas Klärung, was gerade passiert - der push Befehl setzt den Wert aus dem angegebenen Register (ebp in diesem Fall) auf den Stapel und dekrementiert den Stapelzeiger um den entsprechenden Betrag. Die pop Operation ist das Gegenteil - sie erhöht den Stapelzeiger und nimmt einen Wert vom Stapel und legt ihn in das angegebene Register.