Académique Documents
Professionnel Documents
Culture Documents
Source ne peut pas être immediat (constante), et edx ne peut être source
Ces instructions affectent eFLAGS: CF = dernier bit sorti, SF = changement de signe, ZF, PF
ret
Adresse
basses
Adresse
hautes
0xFFFFFFFC
Adresse
basses
Le programme réside
quelque part en mémoire
Programme
Adresse
hautes
0xFFFFFFFC
Adresse
basses
Et contient:
Adresse
hautes
0xFFFFFFFC
Adresse
basses
Et contient:
Adresse
hautes
0xFFFFFFFC
Adresse
hautes
Et contient:
Adresse
basses
0x00000004
0x00000000
ebx 12
ebp 13
ebx 12
ebx 12
esp 10 ecx 13
pushl %eax
PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEF00
eax à cette place
ebp 13
ebx 12
esp 12
10 ecx 13
pushl %ebx
PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEEFC
ebx à cette place
ebp 13
PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEEF8
ecx à cette place
ebp 13
PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEEF4
edx à cette place
ebp 13
PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEEF4
edx à cette place
ebp 13
PILE edx 15
va mettre la valeur en haut
de la pile dans ebx, puis va esp 0xEEF8
incrémenter esp de 4
ebp 13
PILE edx 15
va mettre la valeur en haut
de la pile dans eax, puis va esp 0xEEFC
incrémenter esp de 4
ebp 13
%eax 0xFFFF0001
%bx 0x0061
%cl 0xE1
%eax 0xFFFFFF61
%bx 0xFFE1
%cl 0x01
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: 2022/02/02 INF1600: Architecture des micro-ordinateurs 50
Exercices
Exercice 5
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: 2022/02/02 INF1600: Architecture des micro-ordinateurs 51
Exercices
Exercice 5
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
loop L1
pushl 4(%ebx) Il faut se référer pour cela
pushl $p_int
ret call printf aux conventions du C de
addl $8, %esp GNU GCC. Matière de la
popl %ecx
Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs
semaine prochaine… 52
.data
Exercices A: .int 36
B: .int 24
.text
Exercice 6: .globl main
main:
À faire à la maison. movl A, %eax
movl B, %edx
Quelle valeur sera contenue dans %eax à la fin de while_loop:
l’exécution de ce programme? cmpl $0, %edx
jz bye
jmp while_loop
bye:
ret