Vous êtes sur la page 1sur 53

Assembleur

Instructions UAL et directives


Cours 04
Plan de la séance
Multiplication et division
Opérations logiques
Directives
Concept de pile
Exercices

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 2


Plan de la séance
Multiplication et division
Opérations logiques
Directives
Concept de pile
Exercices

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 3


Multiplication et division
Multiplication non signée
mul source8 # ax  al * source8
mul source16 # dx:ax  ax * source16
mul source32 # edx:eax  eax * source32

Source ne peut pas être immediat (constante)


CF et OF à 1 si le résultat dépasse la largeur de la source

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 4


Multiplication et division
Multiplication signée
imul source8 # ax  al * source8
imul source16 # dx:ax  ax * source16
imul source32 # edx:eax  eax * source32

Il est possible de spécifier la destination:


imul source, dest # dest  dest * source

Il est possible de multiplier par un immediat (constante):


imul const, source, dest # dest  const * source

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 5


Multiplication et division
Exemple 1 .data
unword: .word 20
.text
.global main
main:
mov $3, %ax
mov $5, %bx
mov $10, %dx # la valeur de %dx sera écrasée
mul %bx # dx = 0 : ax = 15 : CF = 0 : OF = 0
mulw unword # dx = 0 : ax = 300 : CF = 0 : OF = 0

mov $255, %bl


mov $2, %al
mul %bl # ax = 1FE16 (ou 51010) : CF = 1 : OF = 1
# (car résultat n’entre pas dans %al)
mov $2, %al # 255 (FF16) sur 8-bits est -1 en signé
imul %bl # ax = 2*-1 = -2 = FFFE16 : CF = 0 : OF = 0
mov $10, %bx
imul %ax, %bx # bx = -20 : CF = 0 : OF = 0
ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 6


Multiplication et division
Division non signée
div source8 # al  ax / source8
# ah  ax mod source8
div source16 # ax  dx:ax / source16
# dx  dx:ax mod source16
div source32 # eax  edx:eax / source32
# edx  edx:eax mod source32

Source ne peut pas être immediat (constante), et edx ne peut être source

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 7


Multiplication et division
Division signée
idiv source8 # al  ax / source8
# ah  ax mod source8
idiv source16 # ax  dx:ax / source16
# dx  dx:ax mod source16
idiv source32 # eax  edx:eax / source32
# edx  edx:eax mod source32

Il n’y a pas d’option idiv source, dest

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 8


Multiplication et division
Exemple 2 .data
unword: .word 20
.text
.global main
main:
mov $0, %dx # precaution
mov $78, %ax
mov $5, %bx
div %bx # ax = 15 : dx = 3, ((dx#ax)/bx donne 15 reste 3)

mov $0, %dx # precaution


mov $122, %ax
divw unword # ax = 6 : dx = 2, ((dx#ax)/M16[unword] donne 6 reste 2)

mov $0xffff, %dx


mov $0xffff, %ax
mov $2, %bx
#div %bx # Divide Error (débordement)
ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 9


Plan de la séance
Multiplication et division
Opérations logiques
Directives
Concept de pile
Exercices

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 10


Opérations logiques
Instructions logiques
and src, dest # souvent utilisé pour forcer des bits à 0
or src, dest # souvent utilisé pour forcer des bits à 1
xor src, dest # souvent utilisé pour inverser des bits ou mettre reg à 0

Ces instructions affectent eFLAGS: OF = 0, CF = 0, SF, ZF, PF

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 11


Opérations logiques
Exemple 3
.data
nombre: .byte 6
.text
.global main
main:
mov nombre, %al # %al = 6
or $’0’, %al # %al = ‘6’, aurait pu faire add $’0’,%al aussi
and $0xF, %al # %al = 6, prend les 4 bits de poids faible
ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 12


Opérations logiques
Instructions de décalage
shr src, dest # dest  dest >> src (décalage logique)
sar src, dest # dest  dest >> src (décalage arithmétique)
shl src, dest # dest  dest << src (décalage logique)
sal src, dest # dest  dest << src (décalage arithmétique, identique à shl)

Ces instructions affectent eFLAGS: CF = dernier bit sorti, SF = changement de signe, ZF, PF

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 13


Opérations logiques
Instructions de rotation
ror src, dest # rotation vers la droite
rol src, dest # rotation vers la gauche
rcr src, dest # rotation vers la droite avec CF
rcl src, dest # rotation vers la gauche avec CF

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 14


Opérations logiques
Exemple 4
.text
.global main
main:
mov $0b11110111, %al
sar $1, %al # al = 111110112 : CF = 1 : OF = 0
shl $1, %al # al = 111101102 : CF = 1 : OF = 0
shl $5, %al # al = 110000002 : CF = 0 : OF = 0
rol $1, %al # al = 100000012 : CF = 1 : OF = 0

mov $4, %cl


rcl %cl, %al # al = 000111002 : CF = 0

ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 15


Plan de la séance
Multiplication et division
Opérations logiques
Directives
Concept de pile
Exercices

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 16


Directives
Directives de remplissage
Remplissage de mémoire
.fill repretitions, nbBytes, valeur(=0)
.skip repretitions, valeur # équivalent à .fill répétitions, 1, valeur
.space # synonyme de .skip

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 17


Plan de la séance
Multiplication et division
Opérations logiques
Directives
Concept de pile
Exercices

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 18


Concept de pile
Vue conceptuelle de la mémoire
0x00000000
0x00000004

Adresse
basses
Adresse
hautes
0xFFFFFFFC

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 19


Concept de pile
Vue conceptuelle de la mémoire
0x00000000
0x00000004

Adresse
basses
Le programme réside
quelque part en mémoire
Programme

Adresse
hautes
0xFFFFFFFC

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 20


Concept de pile
Vue conceptuelle de la mémoire
0x00000000
0x00000004

Adresse
basses
Et contient:

Une partie Instructions


TEXT
Une partie Données Programme
DATA

Adresse
hautes
0xFFFFFFFC

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 21


Concept de pile
Vue conceptuelle de la mémoire
0x00000000
0x00000004

Adresse
basses
Et contient:

Une partie Instructions TEXT


Une partie Données DATA
Programme
Qui croît vers les
Et une pile… PILE adresses basses

Adresse
hautes
0xFFFFFFFC

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 22


Concept de pile
Vue conceptuelle de la mémoire
0xFFFFFFFF

Adresse
hautes
Et contient:

Et une pile… PILE


Qui croît vers les
Programme adresses basses
Une partie Données DATA
Une partie Instructions TEXT

Adresse
basses
0x00000004
0x00000000

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 23


Concept de pile
La pile est gérée par le processeur
• Elle est utilisée pour retrouver l’adresse de retour de fonction (et interruptions)
• Utile pour sauvegarder temporairement des valeurs
• Permet de manipuler les variables locales d’une fonction
• Sert à envoyer les paramètres des fonctions

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 24


Concept de pile
Comportement de la pile

Direction des adresses basses


eax 10

ebx 12

Le registre esp ecx 13


esp
pointe vers le
PILE edx 15
haute de la pile
esp 0xEF04

ebp 13

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 25


Concept de pile
Comportement de la pile

Direction des adresses basses


eax 10

ebx 12

Le registre esp ecx 13


esp
pointe vers le
PILE edx 15
haute de la pile
Cette case mémoire esp 0xEF04
se trouve à 0xEF04
ebp 13

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 26


Concept de pile
Comportement de la pile

Direction des adresses basses


eax 10

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

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 27


Concept de pile
Comportement de la pile

Direction des adresses basses


eax 10

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

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 28


Concept de pile
Comportement de la pile

Direction des adresses basses


eax 10
esp 13
ebx 12
12
10 ecx 13
pushl %ecx

PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEEF8
ecx à cette place
ebp 13

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 29


Concept de pile
Comportement de la pile

Direction des adresses basses


esp 15 eax 10
13
ebx 12
12
10 ecx 13
pushl %edx

PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEEF4
edx à cette place
ebp 13

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 30


Concept de pile
Comportement de la pile

Direction des adresses basses


esp 15 eax 10
13
ebx 12
12
Cette case mémoire
se trouve à 0xEEF4 10 ecx 13
pushl %edx

PILE edx 15
va décrémenter esp de 4
Et mettre le contenu de esp 0xEEF4
edx à cette place
ebp 13

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 31


Concept de pile
Comportement de la pile

Direction des adresses basses


15 eax 10
esp 13
ebx 15
12
10 ecx 13
popl %ebx

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

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 32


Concept de pile
Comportement de la pile

Direction des adresses basses


15 eax 13
13
ebx 15
esp 12
10 ecx 13
popl %eax

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

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 33


Concept de pile
Comportement de la pile

Direction des adresses basses


15 eax 13
13
ebx 15
12
10 ecx 13
addl $8, %esp
esp
PILE edx 15
incrémenter esp de 8
Équivaut à dépiler deux esp 0xEF04
valeurs de la pile
ebp 13

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 34


Concept de pile
Comportement de la pile

Direction des adresses basses


15 eax 13
13
ebx 15
12
10 ecx 13
addl $8, %esp
esp
PILE edx 15
incrémenter esp de 8
Équivaut à dépiler deux esp 0xEF04
valeurs de la pile
ebp 13

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 35


Plan de la séance
Multiplication et division
Opérations logiques
Directives
Concept de pile
Exercices

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 36


Exemples et exercices .data
A: .int 81
B: .int 15
C: .int 0
Retour sur l’exercice du Cours 03 .text
.globl main
Que contiennent les registres %eax et %edx à la main:
fin du programme? movl A, %eax
movl B, %edx
%eax = 0, %edx = 15 jmp Test
L1:
Que contient l’emplacement mémoire étiqueté C sub %edx, %eax
à la fin du programme? Test:
cmp %edx, %eax
6
jae L1
À quoi correspond cette valeur?
movl %eax, C
Mod(81, 15) = 6
movl $0, %eax
ret
Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 37
Exercices
Exercice 1:
pushl %eax
Soit l’extrait de code assembleur ci-contre. movw %bx, %ax
movb %cl, %bl
En supposant que les registres %eax, %bx et %cl popl %ecx
contenaient les valeurs -31, 1 et ‘a’ respectivement,
quelle sera le contenu des registres en hexadécimal
suite à l’exécution dudit extrait.

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 38


Exercices
Exercice 1:
pushl %eax
Soit l’extrait de code assembleur ci-contre. movw %bx, %ax
movb %cl, %bl
En supposant que les registres %eax, %bx et %cl popl %ecx
contenaient les valeurs -31, 1 et ‘a’ respectivement,
quelle sera le contenu des registres en hexadécimal
suite à l’exécution dudit extrait.

%eax 0xFFFF0001
%bx 0x0061
%cl 0xE1

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 39


Exercices
Exercice 2:
pushl %eax
Soit l’extrait de code assembleur ci-contre. movb %cl, %al
movw %bx, %cx
En supposant que les registres %eax, %bx et %cl popl %ebx
contenaient les valeurs -31, 1 et ‘a’ respectivement,
quelle sera le contenu des registres en hexadécimal
suite à l’exécution dudit extrait.

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 40


Exercices
Exercice 2:
pushl %eax
Soit l’extrait de code assembleur ci-contre. movb %cl, %al
movw %bx, %cx
En supposant que les registres %eax, %bx et %cl popl %ebx
contenaient les valeurs -31, 1 et ‘a’ respectivement,
quelle sera le contenu des registres en hexadécimal
suite à l’exécution dudit extrait.

%eax 0xFFFFFF61
%bx 0xFFE1
%cl 0x01

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 41


Exercices
Exercice 3:
.data
L’exécution du programme est supposée afficher les 15 entiers déclarés au début du
values: .int 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
programme :
n: .int 15
formatted_string: .ascii "%d \0" ~$ ./prog
L1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
endl: .ascii "\n\0" pushl (%ebx) ~$
pushl $formatted_string
call printf Or elle produit l’affichage erratique suivant :
.text
.global main addl $8, %esp ~$ ./prog
addl $4, %ebx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 15 2122789 10 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
main: loop L1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
pushl %ebp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
movl %esp, %ebp pushl $endl 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
pushl %ebx call printf 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
addl $4, %esp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
movl $values, %ebx movl $0, %eax 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
movl n, %ecx popl %ebx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
popl %ebp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ret 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Que s’est-t-il passé? 0 0 0 0 Segmentation fault (core dumped)

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 42


Exercices
Exercice 3:
.data
L’exécution du programme est supposée afficher les 15 entiers déclarés au début du
values: .int 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
programme :
n: .int 15
formatted_string: .ascii "%d \0" ~$ ./prog
L1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
endl: .ascii "\n\0" pushl %ecx ~$
pushl (%ebx)
pushl $formatted_string Or elle produit l’affichage erratique suivant :
.text
.global main call printf ~$ ./prog
addl $8, %esp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 15 2122789 10 0 0 0
addl $4, %ebx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
main: popl %ecx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
pushl %ebp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
movl %esp, %ebp loop L1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
pushl %ebx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
pushl $endl 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
call printf 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
movl $values, %ebx addl $4, %esp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
movl n, %ecx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
movl $0, %eax 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
popl %ebx 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
popl %ebp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ret 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Que s’est-t-il passé? 0 0 0 0 Segmentation fault (core dumped)

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 43


Formulation du problème…
Exercices 4&5 - Formulation du problème
Considérez ce programme, pour lequel nous avions déterminé qu’il modifiait la section .data comme suit:
.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:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx

loop L1
ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 44


Formulation du problème…
Exercices 4&5 - Formulation du problème
On désire afficher les 4 valeurs calculées (1, 2, 3 et 5) dans la boucle L1 en appelant la fonction printf(…)
.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:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx

loop L1
ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 45


Exercices
Exercices 4&5 - Formulation du problème
La fonction printf(…) prend un pointeur vers une chaine de caractères comme paramètre et l’affiche
.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:
movl IT, %ecx
movl $F, %edx
L1:
movl (%edx), %eax
addl 4(%edx), %eax
movl %eax, 8(%edx);
addl $4, %edx

loop L1
ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 46


Exercices
Exercices 4&5 - Formulation du problème
Si la chaine de caractère contient le formatage "%d", la fonction printf(…) peut prendre un 2e paramètre…
.data
p_int: .ascii "%d\n\0"
… un entier qu’elle affiche à la console
IT: .int 4
F: .int 0, 1, 0, 0, 0, 0 F: .int 0, 1, 1, 2, 3, 5
.text
.global main

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

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 47


Exercices
Exercices 4&5 - Formulation du problème
On modifie le programme en ajoutant les lignes suivantes
.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:
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

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 48


Exercices
Exercice 4
En ajoutant les lignes pour afficher les valeurs 1, 2, 3, 5, le programme affiche 0 à l’infini. 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:
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

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 49


Exercices
Exercice 4
En ajoutant les lignes pour afficher les valeurs 1, 2, 3, 5, le programme affiche 0 à l’infini. 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, %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

movl %edx, %ecx


movl $0, %edx
div %ecx

movl %ecx, %eax

jmp while_loop

bye:
ret

Mise à jour: 2022/02/02 INF1600: Architecture des micro-ordinateurs 53

Vous aimerez peut-être aussi