QCM Pile et appels de fonctions/Corrige affiche : Différence entre versions

De Ensiwiki
Aller à : navigation, rechercher
(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"