2010-09-03 16 views
37

Użyłem stosu w złożeniu, ale nie miałem pojęcia o push ebp i pop ebp.wyjaśnienie dotyczące instrukcji push ebp i pop ebp w zestawie

.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

Dlaczego publikujesz cały kod, gdy masz wątpliwości tylko z 6 liniami? – Searock

+8

Zawsze lepiej podać więcej kontekstów niż mniej. To powiedziawszy, rzeczywiste pytanie jest naprawdę niejasne i użyłoby jakiegoś więcej wyjaśnień. –

Odpowiedz

58

Nie jestem pewien, czy to jest twoje wątpliwości, ale być może zastanawiasz się o tym:

push ebp 
mov ebp, esp 
sub esp, 12 

Pierwsze 2 linie są znane jako funkcji montażowej prolog. Przechowuje poprzedni wskaźnik bazowy (ebp) i ustawia wskaźnik bazowy, ponieważ był to wierzchołek stosu. Oznacza to, że cała zawartość stosu jest zapisywana na stosie, więc funkcja może naciskać/popować w stosie.

Linia sub esp,12 oszczędza miejsce na zmienne lokalne w funkcji.

Na koniec trzeba:

mov esp, ebp 
pop ebp 
ret 

Jest to odwrotność prologu robi, więc poprzedni kontekst może zostać przywrócona.

Czy to Twoja wątpliwość? :)

+5

Zauważ też, że masz instrukcję o nazwie 'leave', która jest dokładnie tym, co' mov esp, ebp' i 'pop ebp' robi. – jyz

37

ebp jest znany jako wskaźnik bazowy lub wskaźnik ramki. Po wejściu do funkcji naciskasz (aby zapisać wartość dla funkcji wywołującej). Następnie skopiuj esp, wskaźnik stosu, do ebp, dzięki czemu ebp wskaże teraz ramkę stosu twojej funkcji. Na koniec funkcji, następnie pop ebp, aby przywrócić wartość funkcji wywołującej.

Aby wyjaśnić dokładnie, co się dzieje - instrukcja push umieszcza wartość z określonego rejestru (ebp w tym przypadku) na stosie i zmniejsza wskaźnik stosu o odpowiednią wartość. Operacja pop jest odwrotna - zwiększa wskaźnik stosu i pobiera wartość ze stosu i umieszcza go w określonym rejestrze.

Powiązane problemy