Académique Documents
Professionnel Documents
Culture Documents
• À défaut de désactiver votre microphone et votre caméra, vous consentez à l’enregistrement audio ou
audiovisuel, à la conservation, à l’utilisation et à la rediffusion de l’enregistrement de votre nom, de votre
voix et de votre image dans le cadre de l’activité d’enseignement en ligne.
• Pour plus d’information, veuillez consulter la mention relative à la protection des renseignements
personnels sur le site Moodle du cours.
TEXT
main:
call fct1
call fct2
call fct1
ret
fct2:
ret
main:
Les appels de fonction call fct1
sont des branchements call fct2
call fct1
ret Le programme
sait où il faut
fct2: aller grâce à
ret l’étiquette
main:
call fct1
call fct2
call fct1
main:
call fct1
call fct2
call fct1
main:
call fct1
Deux options sont call fct2
possibles dans cet call fct1
exemple
0x3000 fct2:
ret esp 0xEF04
0x3FFC
esp
PILE 0x4000 main: add … eip
0x4004 call fct1
eip 0x4000
0x4008 call fct2
0x400C call fct1
0x4010
0x3000 fct2:
ret esp 0xEF04
0x3FFC
esp
PILE 0x4000 main: add … eip
0x4004 call fct1
eip 0x4000
0x4008 call fct2
0x400C call fct1
0x4010
0x3000 fct2:
0x4008 ret esp 0xEF00
esp 0x3FFC
0x3000 fct2:
0x4008 ret esp 0xEF00
esp 0x3FFC
0x3000 fct2:
0x4008 ret esp 0xEF00
esp 0x3FFC
0x3000 fct2:
0x4008 ret esp 0xEF04
0x3FFC
esp
PILE 0x4000 main: add …
0x4004 call fct1
eip 0x4008
0x4008 call fct2 eip
0x400C call fct1
0x4010
0x3000 fct2:
0x400C ret esp 0xEF00
esp 0x3FFC
0x3000 fct2:
0x400C ret eip esp 0xEF00
esp 0x3FFC
0x3000 fct2:
0x400C ret esp 0xEF04
0x3FFC
esp
PILE 0x4000 main: add …
0x4004 call fct1
eip 0x400C
0x4008 call fct2
0x400C call fct1 eip
0x4010
0x3000 fct2:
esp 0x4010 ret esp 0xEF00
0x3FFC
0x3000 fct2:
esp 0x4010 ret esp 0xEF00
0x3FFC
0x3000 fct2:
esp 0x4010 ret esp 0xEF00
0x3FFC
0x3000 fct2:
0x4010 ret esp 0xEF04
0x3FFC
esp
PILE 0x4000 main: add …
0x4004 call fct1
eip 0x4010
0x4008 call fct2
0x400C call fct1
0x4010 eip
appelée
# Prologue # Epilogue
pushl %ebp popl %ebp Old ebp esp ebp
movl %esp, %ebp Return addr.
appelante
1e paramètre ebp + 8
main:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx
loop L1
ret
main:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx
loop L1
ret
main:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx
loop L1
ret
main:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx
loop L1
ret
main:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx
loop L1
ret
main:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx
pushl 4(%edx)
pushl $p_int
loop L1
call printf
ret addl $8, %esp
main:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx
pushl 4(%edx)
pushl $p_int
loop L1
call printf
ret addl $8, %esp
main: Réponse:
movl IT, %ecx
movl $F, %edx
La fonction printf peut
L1: avoir modifié %ecx, qui
movl (%edx), %eax
addl 4(%edx), %eax
sert de compteur de
movl %eax, 8(%edx); boucle à loop. Il faut le
addl $4, %edx sauvegarder d’abord.
pushl %ecx
pushl 4(%edx)
loop L1
pushl $p_int
ret call printf
addl $8, %esp
popl %ecx
Mise à jour: 2021/02/03 INF1600: Architecture des micro-ordinateurs 39
Convention du C
Exercice 6
En sauvegardant le registre ecx avant d’appeler printf, le programme affiche un 1 puis 3 zéros. Que se passe-t-il?
.data
p_int: .ascii "%d\n\0"
IT: .int 4
F: .int 0, 1, 0, 0, 0, 0 F: .int 0, 1, 1, 2, 3, 5
.text
.global main
main: Exécution
movl IT, %ecx
movl $F, %edx
L1: $> ./a.out
movl (%edx), %eax 1
addl 4(%edx), %eax
movl %eax, 8(%edx);
0
addl $4, %edx 0
pushl %ecx
pushl 4(%edx) 0
loop L1
pushl $p_int
ret call printf
addl $8, %esp
popl %ecx
Mise à jour: 2021/02/03 INF1600: Architecture des micro-ordinateurs 40
Convention du C
Exercice 6
En sauvegardant le registre ecx avant d’appeler print, le programme affiche un 1 puis 3 zéros. Que se passe-t-il?
.data
p_int: .ascii "%d\n\0"
IT: .int 4
F: .int 0, 1, 0, 0, 0, 0 F: .int 0, 1, 1, 2, 3, 5
.text
.global main
main: Réponse:
movl IT, %ecx
movl $F, %ebx
La fonction printf peut
L1: avoir modifié %edx. Il faut
movl (%ebx), %eax
addl 4(%ebx), %eax
soit le sauvegarder, ou
movl %eax, 8(%ebx); utiliser %ebx à la place.
addl $4, %ebx
pushl %ecx
pushl 4(%ebx)
loop L1
pushl $p_int
ret call printf
addl $8, %esp
popl %ecx
Mise à jour: 2021/02/03 INF1600: Architecture des micro-ordinateurs 41
Plan de la séance
Introduction à l’assembleur x86 (suite);
Appels de fonction
Convention du C
Instructions UAL et directives;
Multiplication et division
Opérations logiques
Directives
Source ne peut pas être immédiat (constante), et edx ne peut pas être source
while( n > 1 ){
steps = steps + 1
if ( n % 2 == 0 )
n = n/2;
else
n = 3*n + 1;
}
return steps
}
if ( n % 2 == 0 )
n = n/2;
else
# Epilogue n = 3*n + 1;
popl %ebp }
ret # resultat dans %eax
return steps
}
if ( n % 2 == 0 )
n = n/2;
# Epilogue else
popl %ebp n = 3*n + 1;
ret # resultat dans %eax }
return steps
}
if ( n % 2 == 0 )
n = n/2;
popl %ebx else
# Epilogue n = 3*n + 1;
popl %ebp }
ret # resultat dans %eax
return steps
}
On incrément steps if ( n % 2 == 0 )
n = n/2;
else
n = 3*n + 1;
}
return steps
}
Fin_boucle: # Va vers Test
Fin:
# resultat (steps) est dans %eax
…
return steps
Fin_boucle: # Va vers Test }
Fin:
# resultat (steps) est dans %eax
…
return steps
Fin_boucle: # Va vers Test }
Fin:
# resultat (steps) est dans %eax
…
return steps
Fin_boucle: # Va vers Test }
Fin:
# resultat (steps) est dans %eax
…
Ces instructions affectent eFLAGS: CF = dernier bit sorti, SF = changement de signe, ZF, PF
ret
.ascii "HELLO"
.fill 3,2,0xab
'H', 'E', 'L', 'L', 'O', 0, 0xab, 0, 0xab, 0, 0xab, 0, 5, 0, 0, 0, 6
.word 5
|.ASCII | .FILL |.WORD |.LONG |
.long 6