wake-up-neo.com

Erklärung zu Push-ebp- und Pop-ebp-Anweisungen in der Assembly

ich habe Stack in Assembly verwendet, aber ich hatte keine Ahnung von Push Ebp und Pop Ebp.

.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
40
bunty

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

Push    ebp
mov ebp, esp
sub esp, 12

Die ersten beiden Zeilen werden als Prolog Assembly-Funktion bezeichnet. Es speichert den vorherigen Basiszeiger (ebp) und setzt den Basiszeiger so, wie er oben im Stapel war. Dies bedeutet, dass der gesamte Stapelinhalt im Stapel gespeichert wird, sodass die Funktion Push/Pop im Stapel ausführen kann.

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

Am Ende haben Sie:

mov esp, ebp
pop ebp
ret

Dies ist die Umkehrung, die der Prolog ausführt, damit der vorherige Kontext wiederhergestellt werden kann.

Ist das dein zweifel :)

68
jyz

ebp ist als Basiszeiger oder Rahmenzeiger bekannt. Beim Eintritt in Ihre Funktion drücken Sie sie (um den Wert für die aufrufende Funktion zu speichern). Anschließend kopieren Sie den Stapelzeiger esp in ebp, sodass ebp jetzt auf den Stapelrahmen Ihrer Funktion zeigt. Am Ende Ihrer Funktion fügen Sie dann ebp ein, damit der Wert der aufrufenden Funktion wiederhergestellt wird.

Zur Verdeutlichung dessen, was genau vor sich geht, legt der Befehl Push den Wert aus dem angegebenen Register (in diesem Fall ebp) auf den Stapel und dekrementiert den Stapelzeiger um den entsprechenden Betrag . Die pop -Operation ist das Gegenteil - sie erhöht den Stapelzeiger und entnimmt einen Wert aus dem Stapel und legt ihn im angegebenen Register ab.

41
Carl Norum