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