2010-09-03 12 views
37

J'ai utilisé la pile dans l'assemblage mais je n'ai pas eu d'idée à propos de push ebp et pop ebp.explication à propos de l'instruction push ebp et pop ebp dans l'assemblage

.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

Pourquoi publiez-vous le code entier lorsque vous avez un doute avec seulement 6 lignes? – Searock

+8

Il est toujours préférable de donner plus de contexte que moins. Cela dit, la question réelle est vraiment vague et utiliserait plus d'explications. –

Répondre

58

Je ne sais pas si cela est votre doute, mais peut-être vous demandez à ce sujet:

push ebp 
mov ebp, esp 
sub esp, 12 

Les 2 premières lignes sont connues en fonction d'assemblage Prolog. Il stocke le pointeur de base précédent (ebp) et définit le pointeur de base comme s'il s'agissait du sommet de la pile. Cela signifie que tout le contenu de la pile est sauvegardé dans la pile, de sorte que la fonction peut pousser/pop dans la pile.

La ligne sub esp,12 économise de l'espace pour les variables locales dans la fonction.

A la fin vous avez:

mov esp, ebp 
pop ebp 
ret 

Ceci est l'inverse du fait Prolog, de sorte que le contexte précédent peut être restauré.

Est-ce votre doute? :)

+5

Notez également que vous avez une instruction appelée 'leave' qui correspond exactement à' mov esp, ebp' et 'pop ebp'. – jyz

37

ebp est connu comme le pointeur de base ou le pointeur de trame. En entrant dans votre fonction, vous appuyez dessus (pour enregistrer la valeur de la fonction d'appel). Ensuite, vous copiez esp, le pointeur de pile, dans ebp, de sorte que ebp pointe maintenant vers le cadre de pile de votre fonction. À la fin de votre fonction, vous devez alors afficher ebp pour que la valeur de la fonction appelante soit restaurée. Pour des éclaircissements sur exactement ce qui se passe - l'instruction push place la valeur du registre spécifié (ebp dans ce cas), sur la pile, et décrémente le pointeur de pile de la quantité appropriée. L'opération pop est l'inverse: elle incrémente le pointeur de pile et prend une valeur de la pile et la place dans le registre spécifié.