Ce n'subl faire ici?

Donc... je suis de la compilation en assembleur, avec gcc -S -O2 -m32:

void h(int y){int x; x=y+1; f(y); f(2); }

Et il me donne les éléments suivants:

.file   "sample.c"
.text
.p2align 4,,15
.globl h
.type   h, @function
 h:
pushl   %ebp
movl    %esp, %ebp
subl    $24, %esp
movl    8(%ebp), %eax
movl    %eax, (%esp)
call    f
movl    $2, 8(%ebp)
leave
jmp f
.size   h, .-h
.ident  "GCC: (GNU) 4.4.3 20100127 (Red Hat 4.4.3-4)"
.section    .note.GNU-stack,"",@progbits

Maintenant je sais ce que pushl et movel: ils stockent l'image actuelle du pointeur sur la pile, puis définissez la valeur de l'image de registre de pointeur de la valeur du Pointeur de Pile.

  1. Mais je n'ai aucune idée de ce que le subl $24, %esp est. J'ai compris qu'il se déplace le pointeur de pile vers le bas par 24 octets. - Il Correct?
  2. Qu'est-ce que immed par le chemin?
  3. Pourquoi ne movl 8(%ebp), %eax l'utilisation de 8? Est-il 8 octets? Est-ce pour tenir compte de la valeur de retour + argument y à h? Ou suis-je complètement à côté de la ici. Cela signifie donc, regarder en arrière 8 octets à partir du pointeur de pile?
  4. Ce n' movl $2, 8(%ebp) faire? Il copie contant 2 à l'emplacement 8 octets avant le pointeur de cadre. A l'image du pointeur de changement quand on appelle f? Si oui - puis 8(%ebp) points à l'emplacement d'argument pour f.
  5. Ce qui laisse faire? Comment peut-il "supprimer" un cadre de pile? Je veux dire, vous ne pouvez pas tout simplement supprimer un morceau de la mémoire. Dans la doc il est dit qu'il ne mov esp, ebp), de la pop ebp.

Merci!

Fait intéressant, la réponse ci-dessous a été marqué comme acceptable, même si il ne fait pas de donner une explication à la question 1. Ici c'est une autre question/réponse qui donne une explication à 1.

OriginalL'auteur Andriy Drozdyuk | 2010-03-17