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...) |
|||
Ligne 1 : | Ligne 1 : | ||
<pre> | <pre> | ||
− | .globl main | + | #ifdef __APPLE__ |
+ | #define printf _printf | ||
+ | #define scanf _scanf | ||
+ | #define main _main | ||
+ | #endif | ||
+ | |||
+ | .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 | ||
andl $-16, %esp | andl $-16, %esp | ||
Ligne 18 : | Ligne 29 : | ||
je fin_while | je fin_while | ||
movb (%ecx), %bl | movb (%ecx), %bl | ||
+ | // On empile les arguments de printf | ||
movl $fmt, (%esp) | movl $fmt, (%esp) | ||
movl %ebx, 4(%esp) | movl %ebx, 4(%esp) | ||
+ | // Sauvegarde de %ecx | ||
movl %ecx, 8(%esp) | movl %ecx, 8(%esp) | ||
call printf | call printf | ||
+ | // Restauration de %ecx | ||
movl 8(%esp), %ecx | movl 8(%esp), %ecx | ||
incl %ecx // équivalent à addl $1, %ecx | incl %ecx // équivalent à addl $1, %ecx | ||
Ligne 27 : | Ligne 41 : | ||
fin_while: | fin_while: | ||
+ | // Restauration de registres non-scratch. | ||
movl -4(%ebp), %ebx | movl -4(%ebp), %ebx | ||
leave | leave | ||
ret | ret | ||
.data | .data | ||
− | chaine: .asciz "Hello" | + | chaine: .asciz "Hello\n" |
fmt: .asciz "%c" | fmt: .asciz "%c" | ||
</pre> | </pre> |
Version du 19 mai 2010 à 08:35
#ifdef __APPLE__ #define printf _printf #define scanf _scanf #define main _main #endif .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 andl $-16, %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 movl $fmt, (%esp) movl %ebx, 4(%esp) // Sauvegarde de %ecx movl %ecx, 8(%esp) call printf // Restauration de %ecx movl 8(%esp), %ecx incl %ecx // équivalent à addl $1, %ecx jmp while fin_while: // Restauration de registres non-scratch. movl -4(%ebp), %ebx leave ret .data chaine: .asciz "Hello\n" fmt: .asciz "%c"