QCM Pile et appels de fonctions/Corrige affiche : Différence entre versions
De Ensiwiki
(Nouvelle page : <pre> .globl main main: pushl %ebp movl %esp, %ebp pushl %ebx subl $(8+4), %esp andl $-16, %esp movl $chaine, %ecx // On n'utilise que %bl, mais on remplit // le reste de...) |
m |
||
(3 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
<pre> | <pre> | ||
− | .globl main | + | .globl main |
main: | main: | ||
pushl %ebp | pushl %ebp | ||
movl %esp, %ebp | movl %esp, %ebp | ||
+ | // Sauvegarde du registre non-scratch par | ||
+ | // l'appelé | ||
pushl %ebx | pushl %ebx | ||
+ | // On fait de la place pour : | ||
+ | // 2 arguments du printf | ||
+ | // 1 sauvegarde de registres | ||
subl $(8+4), %esp | subl $(8+4), %esp | ||
− | |||
movl $chaine, %ecx | movl $chaine, %ecx | ||
Ligne 18 : | Ligne 22 : | ||
je fin_while | je fin_while | ||
movb (%ecx), %bl | movb (%ecx), %bl | ||
− | + | // On empile les arguments de printf | |
− | + | // Sauvegarde de %ecx | |
− | + | pushl %ecx | |
+ | pushl %ebx | ||
+ | pushl $fmt | ||
call printf | call printf | ||
− | + | // Dépilage des arguments | |
+ | addl $8, %esp | ||
+ | // Restauration de %ecx | ||
+ | popl %ecx | ||
incl %ecx // équivalent à addl $1, %ecx | incl %ecx // équivalent à addl $1, %ecx | ||
jmp while | jmp while | ||
fin_while: | fin_while: | ||
− | + | // Restauration de registres non-scratch. | |
+ | popl %ebx | ||
leave | leave | ||
ret | ret | ||
.data | .data | ||
− | chaine: .asciz "Hello" | + | chaine: .asciz "Hello\n" |
fmt: .asciz "%c" | fmt: .asciz "%c" | ||
</pre> | </pre> |
Version actuelle en date du 26 juin 2013 à 12:30
.globl main main: pushl %ebp movl %esp, %ebp // Sauvegarde du registre non-scratch par // l'appelé pushl %ebx // On fait de la place pour : // 2 arguments du printf // 1 sauvegarde de registres subl $(8+4), %esp movl $chaine, %ecx // On n'utilise que %bl, mais on remplit // le reste de %ebx avec des 0. movl $0, %ebx while: cmpb $0, (%ecx) je fin_while movb (%ecx), %bl // On empile les arguments de printf // Sauvegarde de %ecx pushl %ecx pushl %ebx pushl $fmt call printf // Dépilage des arguments addl $8, %esp // Restauration de %ecx popl %ecx incl %ecx // équivalent à addl $1, %ecx jmp while fin_while: // Restauration de registres non-scratch. popl %ebx leave ret .data chaine: .asciz "Hello\n" fmt: .asciz "%c"