Répétition 7 - Université de Liège

publicité
Organisation des ordinateurs
Répétition 7
18 avril 2016
Université de Liège
Rappel théorique
Exercice 1
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
• mov al, 34h
mov ah, 12h
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
• mov al, 34h
mov ah, 12h
• (b) mov ax, [1234h]
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
• mov al, 34h
mov ah, 12h
• (b) mov ax, [1234h]
• mov al, [1234h]
mov ah, [1235h]
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
• mov al, 34h
mov ah, 12h
• (b) mov ax, [1234h]
• mov al, [1234h]
mov ah, [1235h]
• (c) mov bx, cx
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
• mov al, 34h
mov ah, 12h
• (b) mov ax, [1234h]
• mov al, [1234h]
mov ah, [1235h]
• (c) mov bx, cx
• mov bh, ch
mov bl, cl
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
• mov al, 34h
mov ah, 12h
• (b) mov ax, [1234h]
• mov al, [1234h]
mov ah, [1235h]
• (c) mov bx, cx
• mov bh, ch
mov bl, cl
• (d) mov [bx], cx
4
Exercice 1
• Les instructions suivantes effectuent des transferts de 16 bits de
données. On demande de décomposer chacune de ces
instructions en deux instructions mov réalisant la même
opération, mais avec des opérandes de 8 bits.
• (a) mov ax, 1234h
• mov al, 34h
mov ah, 12h
• (b) mov ax, [1234h]
• mov al, [1234h]
mov ah, [1235h]
• (c) mov bx, cx
• mov bh, ch
mov bl, cl
• (d) mov [bx], cx
• mov [bx], cl
mov [bx + 1], ch
4
Exercice 1
• (e) mov word [bp + si - 6], 32h
5
Exercice 1
• (e) mov word [bp + si - 6], 32h
• mov byte [bp + si - 6], 32h
mov byte [bp + si - 5], 00h
5
Exercice 2
Exercice 2
Après l’exécution de la séquence d’ instructions suivante, quel sera
le contenu du registre ax ?
move ax, 100h
mov bx, ax
mov [bx + 1], ax
mov [100h], ax
mov si, [bx + 1]
mov al, [si]
mov ah, [bx + si - 101h]
7
Exercice 2
• move ax, 100h
• mov bx, ax
al
00
ah
01
• mov [bx + 1], ax
• mov [100h], ax
• mov si, [bx + 1]
• mov al, [si]
• mov ah, [bx + si - 101h]
8
Exercice 2
• move ax, 100h
• mov bx, ax
• mov [bx + 1], ax
• mov [100h], ax
al
00
ah
01
bl
00
bh
01
• mov si, [bx + 1]
• mov al, [si]
• mov ah, [bx + si - 101h]
8
Exercice 2
• move ax, 100h
• mov bx, ax
• mov [bx + 1], ax
• mov [100h], ax
• mov si, [bx + 1]
al
00
ah
01
bl
00
bh
01
100
??
101
00
102
01
• mov al, [si]
• mov ah, [bx + si - 101h]
8
Exercice 2
• move ax, 100h
• mov bx, ax
• mov [bx + 1], ax
• mov [100h], ax
• mov si, [bx + 1]
al
00
ah
01
bl
00
bh
01
100
00
101
01
102
01
• mov al, [si]
• mov ah, [bx + si - 101h]
8
Exercice 2
• move ax, 100h
• mov bx, ax
• mov [bx + 1], ax
• mov [100h], ax
• mov si, [bx + 1]
• mov al, [si]
• mov ah, [bx + si - 101h]
al
00
ah
01
bl
00
bh
01
100
00
101
01
102
01
si
0101
8
Exercice 2
• move ax, 100h
• mov bx, ax
• mov [bx + 1], ax
• mov [100h], ax
• mov si, [bx + 1]
• mov al, [si]
• mov ah, [bx + si - 101h]
al
01
ah
01
bl
00
bh
01
100
00
101
01
102
01
si
0101
8
Exercice 2
• move ax, 100h
• mov bx, ax
• mov [bx + 1], ax
• mov [100h], ax
• mov si, [bx + 1]
• mov al, [si]
• mov ah, [bx + si - 101h]
al
01
ah
00
bl
00
bh
01
100
00
101
01
102
01
si
0101
8
Exercice 3
Exercice 3
• Pourquoi les instructions suivantes sont-elles incorrectes ?
10
Exercice 3
• Pourquoi les instructions suivantes sont-elles incorrectes ?
• (a) mov ax, cl
10
Exercice 3
• Pourquoi les instructions suivantes sont-elles incorrectes ?
• (a) mov ax, cl
• Les opérandes n’ont pas la même taille.
10
Exercice 3
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
10
Exercice 3
•
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
ax ne peut pas être utilisé pour l’adressage indirect.
10
Exercice 3
•
•
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
ax ne peut pas être utilisé pour l’adressage indirect.
(c) mov [bp + si], 99h
10
Exercice 3
•
•
•
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
ax ne peut pas être utilisé pour l’adressage indirect.
(c) mov [bp + si], 99h
On ne sait pas le nombre de bits des opérandes. Il faudrait
mettre byte (8 bits) ou word (16 bits) devant mov pour le
préciser.
10
Exercice 3
•
•
•
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
ax ne peut pas être utilisé pour l’adressage indirect.
(c) mov [bp + si], 99h
On ne sait pas le nombre de bits des opérandes. Il faudrait
mettre byte (8 bits) ou word (16 bits) devant mov pour le
préciser.
• (d) mov 1234h, ax
10
Exercice 3
•
•
•
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
ax ne peut pas être utilisé pour l’adressage indirect.
(c) mov [bp + si], 99h
On ne sait pas le nombre de bits des opérandes. Il faudrait
mettre byte (8 bits) ou word (16 bits) devant mov pour le
préciser.
• (d) mov 1234h, ax
• On ne peut pas écrire une valeur dans une constante.
10
Exercice 3
•
•
•
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
ax ne peut pas être utilisé pour l’adressage indirect.
(c) mov [bp + si], 99h
On ne sait pas le nombre de bits des opérandes. Il faudrait
mettre byte (8 bits) ou word (16 bits) devant mov pour le
préciser.
• (d) mov 1234h, ax
• On ne peut pas écrire une valeur dans une constante.
• (e) move dx, [bp + bx]
10
Exercice 3
•
•
•
•
•
•
•
•
•
•
•
Pourquoi les instructions suivantes sont-elles incorrectes ?
(a) mov ax, cl
Les opérandes n’ont pas la même taille.
(b) mov [ax], cl
ax ne peut pas être utilisé pour l’adressage indirect.
(c) mov [bp + si], 99h
On ne sait pas le nombre de bits des opérandes. Il faudrait
mettre byte (8 bits) ou word (16 bits) devant mov pour le
préciser.
(d) mov 1234h, ax
On ne peut pas écrire une valeur dans une constante.
(e) move dx, [bp + bx]
Les registres bp et bx ne peuvent pas être utilisés ensembles
dans l’adressage indirect indexé.
10
Exercice 3
• (f) mov dx, bp + si
11
Exercice 3
• (f) mov dx, bp + si
• La seconde opérande ne correspond à aucun mode d’adressage.
Pour calculer la somme des contenus de bp et si, il faudrait
utiliser add.
11
Exercice 3
• (f) mov dx, bp + si
• La seconde opérande ne correspond à aucun mode d’adressage.
Pour calculer la somme des contenus de bp et si, il faudrait
utiliser add.
• (g) mov dx, [bp - si - 9]
11
Exercice 3
• (f) mov dx, bp + si
• La seconde opérande ne correspond à aucun mode d’adressage.
Pour calculer la somme des contenus de bp et si, il faudrait
utiliser add.
• (g) mov dx, [bp - si - 9]
• On ne peut utiliser que la somme de deux registres dans
l’adressage indirect indexé, pas leur différence.
11
Exercice 4
Exercice 4
• Écrire un programme assembleur 80x86 destiné à compter le
nombre d’octets non nuls contenus dans une suite d’octets
consécutifs du segment de données. L’offset du premier octet
est initialement contenu dans le registre BX et le nombre
d’octets de la suite se trouve dans le registre CX. On peut
supposer que la suite contient au moins un octet. Le nombre
d’octets non nuls devra être contenu dans le registre AX en fin
d’exécution.
13
Exercice 4
• BX : l’offset du premier octet
• CX : le nombre d’octets
• AX : sera le nombre d’octets non nuls
14
Exercice 4
• BX : l’offset du premier octet
• CX : le nombre d’octets
• AX : sera le nombre d’octets non nuls
14
Exercice 4
• BX : l’offset du premier octet
• CX : le nombre d’octets
• AX : sera le nombre d’octets non nuls
14
Exercice 4
• BX : l’offset du premier octet
• CX : le nombre d’octets
• AX : sera le nombre d’octets non nuls
SECTION.text
• Début et fin du programme
ret
14
Exercice 4
• BX : l’offset du premier octet
• CX : le nombre d’octets
• AX : sera le nombre d’octets non nuls
• Début et fin du programme
SECTION.text
mov ax, 0
• Initialiser ax
ret
14
Exercice 4
• BX : l’offset du premier octet
• CX : le nombre d’octets
• AX : sera le nombre d’octets non nuls
SECTION.text
mov ax, 0
• Début et fin du programme
• Initialiser ax
• Boucler sur les élements de
la suite
boucle
inc bx
loop boucle
ret
14
Exercice 4
• BX : l’offset du premier octet
• CX : le nombre d’octets
• AX : sera le nombre d’octets non nuls
• Début et fin du programme
• Initialiser ax
• Boucler sur les élements de
la suite
• Si un octet n’est pas nul,
incrémenter ax
boucle
suivant
SECTION.text
mov ax, 0
cmp byte [bx], 0
je suivant
inc ax
inc bx
loop boucle
ret
14
Exercice 5
Exercice 5
• Ecrire un programme assembleur 80x86 capable de calculer le
produit scalaire de deux vecteurs de nombres entiers. Les
composantes des vecteurs sont non signées et encodées sur 8
bits ; chaque vecteur correspond donc à une suite d’octets
consécutifs du segment de données. Les deux vecteurs à
multiplier sont initialement pointés par les registres AX et BX. Le
registre CX contient le nombre de composants de chaque
vecteur (ils ont tous deux la même dimension, supposée non
nulle). En fin d’exécution, le registre DX doit contenir le produit
scalaire de ces deux vecteurs.
16
Exercice 5
• AX : le premier vecteur à multiplier
• BX : le deuxième vecteur à multiplier
• CX : le nombre de composants de chaque vecteur
• DX : sera le produit scalaire de ces deux vecteurs
boucle:
SECTION .text
mov bp, ax
mov dx, 0
mov si, 0
mov al, [bp + si]
mul byte [bx + si]
add dx, ax
inc si
loop boucle
ret
17
Des questions ?
18
Theme
Get the source of this theme and the demo presentation from
github.com/matze/mtheme
The theme itself is licensed under a Creative Commons
Attribution-ShareAlike 4.0 International License.
cb a
19
Téléchargement