Correction du contrôle 2003 - Bienvenue sur la page de Jack

publicité
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
Éléments de correction Contrôle
Architecture des microprocesseurs
Durée 2 heures
Tous les documents personnels (cours, TD, TP) sont autorisés.
La machine à calculer est autorisée.
La qualité de la présentation sera prise en compte dans le barème de notation.
Les trois parties de ce contrôle sont totalement indépendantes.
Il vous est demandé de rédiger chacune des parties sur une copie séparée.
Pensez à rappeler le numéro des questions auxquelles vous répondez.
N’oubliez pas de joindre tous les documents réponses à votre copie.
Remarque concernant les éléments de correction :
Les éléments de correction font apparaître pour les exercices, plusieurs solutions
possibles ainsi que des rappels afin d’aborder ceux-ci convenablement. Il n’était pas demandé
aux étudiants d’être aussi précis dans leur démarche.
Partie A
Architecture du microprocesseur 68000 de MOTOROLA
Décodage d’adresses
Une carte micro-programmée comporte un composant RAM et un composant EPROM
câblés sur le bus d’adresse comme indiqué ci-dessous :
(A0…A15)
(A0…A15)
Bus d’adresse
U2
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
U1
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
E1
D0
D1
D2
D3
D4
D5
D6
D7
A 15
CE
OE
WE
U3
1
74LS04
RAM: 6132
E2
D0
D1
D2
D3
D4
D5
D6
D7
CE
VPP
0V
EPROM: 2764
(D0…D7)
Bus de données
A.1. Etude du composant RAM (U1)
(3 points / 8mn)
A.1.1) Indiquer le rôle de l’entrée E1. Quel doit être l’état actif de cette entrée E pour effectuer une
écriture d’une donnée dans la RAM (U1).
L’entrée E1 est connectée sur la broche CE (Chip Enable ou validation boîtier) du
composant RAM. Celle -ci permet au composant RAM d’être sélectionné et d’avoir son
bus de donnée connecté à celui du microprocesseur. Cette entrée est active à l’état bas.
Pour pouvoir effectuer une écriture cette entrée doit être à l’état bas ainsi que l’entrée
WE .
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
1/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
A.1.2) Déterminer la capacité du composant U1 en Kbits et en Ko.
Afin de déterminer la capacité mémoire de la mémoire RAM (U1), il faut regarder le
nombre de ligne du bus d’adresse du microprocesseur connecté sur le bo îtier mémoire.
Seules les lignes A0 ? A11 sont utilisées.
Il y a donc 12 lignes qui permettent d’avoir 212 combinaisons différentes d’adresses.
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
Combinaison la plus petite
A15
A14
A13
A12
0
0
0
0
0
0
0
0
0
0
0
0
0
Combinaison la plus grand e
1
1
1
1
1
1
1
1
1
1
1
1
4095
De la combinaison 0 à la combinaison 4095 il y a 4096 combinaisons soit 4096
emplacements mémoires de 8 bits (octets).
Pour la conversion en Kilo -octets, il suffit de diviser par 1024 (210 ) et cela donne 4Ko.
Pour obtenir la quantité en Kbits il faut considérer que dans un octet il y a huit bits
soit
8 * 4096
= 32kbits .
1024
A.1.3) En supposant que les lignes A15, A14, A13 et A12 du bus d’adresse sont à l’état logique
bas, déterminer la plage d’adresse occupée par le composant U1.
Pour connaître la plage d’adresses occupée par le composant, il faut considérer
l’adresse de début et l’adresse de fin. Il est donné l’état des autres bits du bus
d’adresses (A12 ? A15 ), tous à l’état logique bas pour valider la sélectio n de la RAM
(U1).
A15
A14
A13
A12
0
0
0
0
0
0
0
0
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
0
0
0
0
0
0
0
0
0
0
0
0
$0000
1
1
1
1
1
1
1
1
1
1
$0FFF
1
1
Soit adresse de début $0000 et adresse de fin $0FFF
$FFFF
$F000
$EFFF
$E000
$DFFF
$D000
$CFFF
$C000
$BFFF
$B000
$AFFF
$A000
$9FFF
$9000
$8FFF
$8000
$7FFF
$7000
$6FFF
$6000
$5FFF
$5000
$4FFF
$4000
$3FFF
$3000
$2FFF
$2000
$1FFF
$1000
$0FFF
RAM (U1)
$0000
4ko
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
2/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
A.2. Etude du composant EPROM (U2)
(2 points / 8mn)
A.2.1) Déterminer la capacité du composant U2 en Kbits et en Ko.
De la même manière que la question précédente :
Seules les lignes A0 ? A14 sont utilisées.
Il y a donc 15 lignes qui permettent d’avoir 215 combinaisons différentes d’adresses.
A15
Combinaison la
plus petite
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Combinaison la
plus grande
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
32767
De la combinaison 0 à la combinaison 32767 il y a 32768 combinaisons soit 32768
emplacements mémoires de 8 bits (octets).
Pour la conversion en Kilo -octets, il suffit de diviser par 1024 (210 ) et cela donne 32Ko.
Pour obtenir la quantité en Kbits il faut considérer que dans un octet il y a huit bits
soit
8 * 32768
= 256 kbits .
1024
A.2.2) Sachant que le bit A15 du bus d’adresse est inversé puis connecté à l’entrée E2 du
composant U2, déterminer la plage d’adresse occupée par le composant U2
Pour que le composant mémoire U2 (EPROM) soit sélectionné, il faut que sur l’entrée
CE soit présent un état bas ou alors que le bit d’adresse A15 soit au niveau logique
haut.
A15
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
$8000
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
$FFFF
1
$FFFF
$F000
$EFFF
$E000
$DFFF
$D000
$CFFF
$BFFF
EPROM (U2)
$C000
32Ko
$B000
$AFFF
$A000
$9FFF
$9000
$8FFF
$8000
$7FFF
$7000
$6FFF
$6000
$5FFF
$5000
$4FFF
$4000
$3FFF
$3000
$2FFF
$2000
$1FFF
$1000
$0FFF
RAM (U1)
$0000
4ko
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
3/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
Partie B
Programmation dans le langage assembleur du microprocesseur 68000 de
MOTOROLA
B.1. Généralités (3 points / 14mn)
B.1.1) Donnez le nom d’une mémoire volatile.
R.A.M. : Random Access Memory ou mémoire à accès aléatoire . Vous pouviez donner
le nom des mémoires dérivées : SRAM, DRAM, …
B.1.2) Quels sont les différents bits du registre de code condition ?
Le registre de code condition (CCR) est constitué de 5 bits dont l’é tat dépend de
l’instruction ayant été exécutée. Les autres bits sont à zéro.
0
0
0
X
N
Z
V
C
B.1.3) Proposez une solution permettant de mettre à zéro le cinquième bit du registre de code
condition en partant de la droite. Décrivez convenablement votre solution.
Il s’agit de mettre à zéro le bit X du registre CCR.
Le jeu d’instructions du 68000 possède l’instruction ANDI to CCR permettant de
remettre à zéro le bit voulu du registre de code condition.
Exemple : ANDI #%1110 1111, CCR
Il est rappelé que l’opé ration logique AND a pour élément absorbant la valeur 0 et
pour élément neutre la valeur 1 ; Seul le bit X sera modifié par cette opération
de masquage.
B.1.4) Convertir la valeur $EF en binaire.
$EF ? %1110 1111 : la conversion est directe. Certains peuvent toutefois préférer
passer en décimal, puis effectuer des divisions par deux successives (c’est une
mauvaise méthode qui donne quand même le bon résultat).
B.1.5) Décrire la fonction de la ligne suivante dans un programme écrit en langage assembleur
68000.
DC.L
2
C’est une directive d’assemblage « define data constant » qui permet d’enregistrer
dans la mémoire des opérandes. Le format de l’opérande pour cette ligne est
« .L » soit 32 bits. On enregistrera donc dans la mémoire la valeur « 2 » sur 32
bits soit $00000002 ou %0000 0000 0000 0000 0000 0000 0000 0010
B.1.6) Quel est le rôle du registre PC du processeur 68000 ?
Le registre PC « program counter » contient l’adresse de la prochaine instruction
devant être exécutée. Son contenu est incrémenté en fonction du nombre
d’octets de la dernière instruction exécutée. La valeur de cette adresse est
toujours paire !
B.1.7) Montrez que l’instruction, dbf est équivalente à l’instruction dbra
Info: consulter la description de l’instruction «DBcc » dans le document annexe/jeu
d’instructions.
Il faut vous servir du polycopié « annexes » dans lequel vous avez le jeu
d’instructions (page 12 instruction DBcc) ;
« DBcc » : Cette instruction réalise trois opérations différentes : test, décrémente,
branche.
Si la condition « cc » est fausse, alors décrémenter « D » le registre indiqué
dans l’instruction et brancher « B » à l’adresse indiquée également dans l’instruction.
Si le résultat de la décrémentation donne « -1 » le rebouclage se termine et
passage à l’instruction suivante.
Dans le cas qui vous est proposé « DBF », « cc » est la condition « F », soit « jamais
égal » ou « never equal »
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
4/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
Pour la deuxième instruction DBRA, il n’y a pas de condition pour réaliser la
décrémentation du registre : elle est faite systématiquement.
On remarque donc que dans les deux cas, la condition est toujours considérée comme
fausse et que les seules actions réalisées effectivement sont :
. La décrémentation du registre
. Le branchement si le contenu du registre ? -1.
Ces deux instructions sont donc équivalentes.
Vous pouviez également justifier de la façon suivante :
Dans la documentation correspondant à l'instruction DBF, il est noté :
« Most assemblers accept DBRA for DBF...”
B.1.8) Indiquer de manière simplifiée les différentes étapes pour l’enregistrement d’une donnée
dans la pile.
Lors d’une opération d’écriture dans la pile, il faut utiliser le registre A7 appelé aussi
SP « Stack pointer ». Le contenu de ce registre est systématiquement
prédécrémenté lors d’un empilage «écriture dans la pile » : le nombre de
décrémentation dépend du format de la donnée que l’on écrit dans la pile : les
seules possibilités sont le mot « W » et le long mot « L ».
Exemple : MOVE.W A0,-(A7)
Le registre A7 est décrémenté de deux unités (.W) puis les 16 bits de poids
faibles contenus dans A0 sont recopiés dans la mémoire pointée par le
registre A7. La mémoire pointée par le registre A7 s’appelle la pile.
B.1.9) Décrire les modes d’adressages mis en œuvre dans les deux instructions suivantes pour
chacun des opérande s et donner le contenu de chacun des registres 32 bits et de la mémoire
après exécution :
ü MOVEA.W #$9123, A0
Placer un opérande 16 bits « .W » dans le registre A0.
Piège : Lors d’une écriture avec un registre d’adresse, il y a
systématiquement extension d’adresse. Le bit de poids fort de
l’opérande est recopié sur les bits de poids fort du registre
d’adresse. (%1001 0001 0010 0011).
Adressage immédiat pour l’opérande source « # $9123».
Adressage direct par registre d’adresse pour l’opérande
destination « A0 ».
1
1
1
F
1
1
1
1
F
1
1
1
1
F
1
1
1
1
F
ü MOVE.W
1
1
0
0
1
0
9
0
0
1
1
0
0
1
2
0
0
0
1
1
3
A0, (A0)
Placer un opérande 16 bits « .W » contenu dans le registre
d’adresse A0 dans la mémoire dont l’adresse 32 bits est donnée
dans le registre d’adresse A0.
Adressage direct par registre d’adresse pour l’opérande source
« A0 ».
Adressage indirect pour l’opérande destination « (A0).
Le registre A0 n’est pas modifié et contient toujours la valeur
précédente : $FFFF9123
A l’adresse $FFFF9123 dans la mémoire, on retrouve sur deux
octets (un mot : .W) la valeur $9123 (en espérant que ce soit de
la RAM !).
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
5/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
B.2. Création d’un programme. (5 points / 40mn)
Objectif : Ecrire un programme permettant de trier les valeurs (8 octets) d’un tableau VAL de façon à
séparer les nombres pairs des nombres impairs comme suit :
Le tableau "VAL" se situe à l’adresse $3000
Le tableau "PAIR" qui recevra les nombres pairs se situe à l’adresse $3100
Le tableau "IMPAIR" qui recevra les nombres impairs se situe à l’adresse $3200
B.2.1) En quelques mots, indiquer une méthode permettant de déterminer si un nombre est pair ou
impair en utilisant la notion de décalage.
Première méthode - il convient de faire un décalage de 1 bit vers la droite de la donnée
préalablement enregistrée dans un registre puis de tester la retenue.
Deuxième méthode - il convient de faire une opération de masquage pour ne garder
que le bit de poids faible : ce bit est à un si le résultat du masquage est différent
de 0.
B.2.2) Sur quel indicateur d’état, le test doit-il agir pour définir la parité du nombre ?
En déduire le nom en langage assembleur des 2 tests qu’il est possible de mettre en œuvre.
Le test doit agir s ur l’indicateur de retenue : carry.
Test: BCC « branch if carry clear » ou BCS « branch if carry set ».
B.2.3) Ecrire le programme en langage assembleur 68000 à partir de l’adresse $1000,
correspondant au cahier des charges décrit ci-dessus.
Vous considèrerez un tableau VAL de 8 octets défini comme suit :
VAL
DC.B
$12, $C9, $5F, $FC, $A2, $52, $3B, $FD
Vous utiliserez les registres suivants :
D0
Contient le nombre d’octet de la chaîne VAL, initialisé à la valeur 8.
D1
Contient successivement les valeurs de la chaîne VAL.
A0
Pointe la chaîne VAL.
A1
Pointe la chaîne PAIR.
A2
Pointe la chaîne IMPAIR.
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
6/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
Algorithme
Initialisations pointeurs
1.
2.
3.
4.
Adresse VAL ? A0
Adresse PAIR ? A1
Adresse IMPAIR ? A2
NBRE ? D0
; La solution proposée utilise l’instruction dbra pour le comptage du nombre des éléments
traités.
; Comme la valeur finale testée est « -1 », il ne faut pas oublier de commencer avec la valeur
; maximum moins une unité soit « NBRE-1 ».
5. Décrémenter compteur de valeur (D0) (cf. remarque ci-dessus)
6. Charger la valeur courante de la table VAL dans D1 (pointée par
A0)
Ici on n’effectue pas l’incrémentation du pointeurA0.
7. Décalage à droite du registre D1 à travers la carry.
8. Si carry = 1 sauter à impair
9. Sinon pair
A. Enregistrer la valeur courante pointée par A0 (VAL) dans
la table PAIR pointée par A1
B. Incrémenter pointeur table PAIR
C. Incrémenter pointeur sur la table VAL (A0)
D. Sauter à TEST_FIN_TABLE
10. impair :
A. Enregistrer la valeur courante pointée par A0 (VAL) dans la
table IMPAIR pointée par A2.
B. Incrémenter pointeur table impair
C. Incrémenter pointeur sur la table VAL (A0)
11. TEST_FIN_TABLE :
A. Décrémenter compteur D0
B. Si D0 ? -1 alors valeur suivante (retour au début de la boucle)
C. Sinon Fin_Application
12. Fin_Application
Le programme est donné ci-dessous :
DEBPROG
VAL
PAIR
IMPAIR
NBRE
equ
equ
equ
equ
equ
$1000
$3000
$3100
$3200
$8
org
dc.l
dc.l
$0
$8000
START
org
dc.b
org
ds.b
org
ds.b
VAL
$12,$C9,$5F,$FC,$A2,$52,$3B,$FD
PAIR
NBRE
IMPAIR
NBRE
START
continu
nbimpair
suite
fin
org
lea
lea
lea
clr.l
clr.l
move.b
move.b
lsr
bcs
move.b
jmp
move.b
dbra
bra
end
DEBPROG
VAL,A0
PAIR,A1
IMPAIR,A2
D0
D1
#NBRE-1,D0
(A0),D1
#1,D1
nbimpair
(A0)+,(A1)+
suite
(A0)+,(A2)+
D0,continu
fin
(1)
(2)
(3)
(4)(5)
(6)
(7)
(8)
(9A-B )
(9C)
(10A-B)
(11A-B-C)
(12)
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
7/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
Partie C
Analyse d’un programme en langage assembleur pour le microprocesseur 68000
de MOTOROLA
C.1. Compréhension d’un programme en langage assembleur 68000 (7 points / 50mn)
Le programme suivant réalise une opération sur deux opérandes de deux digits codés en BCD.
Remarque s :
ü Vous considèrerez donc pour ces deux opérandes la représentation BCD et pas
hexadécimale : Oubliez le « $ » marqué devant l’opérande mais ne l’enlevez pas.
ü Si on ne met pas le « $ », le logiciel d’assemblage fait la conversion en hexadécimal.
*************************************
* ECE Mars 2003
* INGE3 - PREPA MASTER
* Contrôle Architecture des microprocesseurs
* J. FRANCOMME - http://francomme.fr.fm
* Etat initial du registre des flags : X N Z V
C tous à 0.
*************************************
*************************************
* Assignations
*************************************
DEBPROG EQU
$1000
VAL1
EQU
$35
VAL2
EQU
$11
efface_X
EQU
$EF
*************************************
* Initialisation des vecteurs de démarrage
*************************************
ORG
$0
DC.L $8000
Pointeur de pile
après un reset
DC.L DEBPROG
Compteur de
programme (PC) après un reset
*************************************
* Programme principal
*************************************
ORG
DEBPROG
FIN
MOVE.W
MOVE.W
MOVE.W
ANDI
BSR
MOVE.W
MOVE.W
LSR.B
ANDI.W
BSR
LSL.W
BSR
BRA
*************************************
* Bibliothèques de sous-programmes
*************************************
DOFOISD5
CLR.W
D6
BRA
NEXT
SUITE ANDI
#efface_X,CCR
ABCD
D0,D6
BCC
NEXT
ADD.W
#$0100,D6
NEXT DBF
D5,SUITE
RTS
D6PLUSD7
ANDI
ABCD
ROR.W
ROR.W
ABCD
ROR.W
RTS
#efface_X,CCR
D7,D6
#8,D6
#8,D7
D7,D6
#8,D6
END
#VAL1,D0
#VAL2,D1
D1,D5
#$0F,D5
DOFOISD5
D6,D7
D1,D5
#4,D5
#$0F,D5
DOFOISD5
#4,D6
D6PLUSD7
FIN
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
8/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
C.1.1) Complétez le s documents réponses joints pages 5 et 6 en vous aidant
suivantes :
des remarques
Remarque : Seuls les registres modifiés sont notés dans le tableau pour éviter de
surcharger le document et laisser ainsi apparaître les éléments importants . Les
valeurs du registre PC sont donné es sur 32 bits, la solution où seulement 16 bits
apparaissent est aussi valable.
Aide pour compléter les documents réponses :
ü Vous remarquerez que le sous-programme D0FOISD5 est appelé deux fois et que le
sous-programme D6PLUSD7 est appelé une seule fois à la fin de l’application : pour
les valeurs choisies.
ü Vous trouverez donc le groupe d’instructions de chaque sous-programme autant de fois
que celui-ci est appelé , sur les documents réponses.
ü Après l’exécution de chaque instruction, donnez le contenu de tous les registres cités
dans le tableau, sur la même ligne ; c'est-à-dire : D0, D1, D5, D6, D7, les bits X et C
et N du registre de code condition puis le contenu du registre PC : il faut pour cela
utiliser le fichier listing.
ü Comme cela est indispensable, le fichier listing vous est fourni en annexe 1.
ü Toutes les valeurs négatives du tableau seront notées en complément à 2.
C.1.2) Après avoir complété les documents réponses joints, il vous est demandé de déduire
l’opération effectuée par cette application sur les deux opérandes : cf. documents réponses.
L’opération effectuée se compose d’additions successives et on remarque de plus que
ces additions se font en BCD. On peut en déduire que cette opération est une
multiplication en BCD. On peut remarquer aussi qu’à la fin de l’exécution de cette
application, le résultat 385 obtenu à partir des opérandes 35 et 11 (il était demandé de
ne pas tenir compte du symbole $) est bien le résultat de l’opération 35 * 11.
C.1.3) Pour vérification, posez l’opération sur votre copie et décrivez le processus pour obtenir le
résultat.
35
*
11
35
35 .
3 85
Résultat du premier appel à la procédure D0FOISD5
Résultat du second appel à la procédure D0FOISD5 suivi du décalage
Résultat du second appel à la procédure D6PLUSD7
Description :
On considère le deuxième opérande « 11 » constitué de deux digits :
D1 D0
1 1
Comme l’addition en BCD ne se fait que sur un octet (ie les huit bits de poids
faibles du registre), l’opération se fera d’abord avec le digit D0 tout seul puis
lors d’un deuxième passage avec le second digit D1 tout seul.
Pour le premier cas, il suffit de masquer tout ce qui se trouve après le
quatrième bit (masquage avec la valeur $0F).
Pour le second cas, il faudra faire d’abord un décalage à droite de quatre bits
pour ramener le digit D1 sur les bits de poids faibles puis masquer tout ce qui
se trouve après le quatrième bit.
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
9/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
C.1.4) Quelle sera la différence dans l’exécution du sous-programme D0FOISD5 si l’opérande
VAL2 = 12 (ie : nombre de boucle) ?
Obtenu après le premier appel à la
Obtenu après le
35
procédure D0FOISD5
deuxième appel à
*
12
la procédure
7 0 Résultat du premier appel à la procédure D0FOISD5
D0FOISD5 puis un
décalage à gauche
3 5 . Résultat du second appel à la procédure D0FOISD5 suivi du décalage
de 4 bits.
4 2 0 Résultat du second appel à la procédure D6PLUSD7
On remarque que lors de l’appel de la première procédure D0FOISD5, il y
Obtenu après
aura deux additions successives. la valeur du digit étant utilisée comme
l’appel à la
compteur, il faudra un tour de plus dans la procédure D0FOISD5 pour
procédure
arriver à la valeur -1 qui fait sortir de la bouc le.
D6PLUSD7
C.1.5) La procédure D6PLUSD7 est constituée d’un certain nombre d’instructions de rotation
« ROR »
C.1.5.1) Expliquez ce que fait l’instruction « ROR » sur la donnée dont le format est celui
donné dans ce sous-programme (.W).
L’instruction effectue une rotation d’un opérande sur 16 bits (.W). Il s’agit
donc d’une permutation entre l’octet de poids faible et l’octet de poids fort (cf.
schéma de rotation dans le polycopié de cours).
C.1.5.2) Indiquez la raison de cette manipulation en utilisant le rappel sur les opérations en
BCD donné ci-dessous.
L’addition en BCD ne pouvant ce faire que sur un octet, il faut faire l’opération
d’abord sur l’octet de poids faible (positionnement éventuel de la retenue
auxiliaire X dans le registre de code condition) puis après une rotation de huit
bits vers la droite sur un message de 16 bits (pour ne rien perdre du message
correspondant au résultat) on effectue l’addition sur la deuxième partie du
résultat ayant pris la place de l’octet de poids faible.
Une fois fini cette dernière opération, il ne faut pas oublier de remettre le
résultat comme il faut en refaisant une rotation à droite de 8 bits sur le message
de 16 bits.
C.1.6) Justifier la valeur $FFF0 de la ligne 103C du fichier listing donné en annexe 1.
La valeur $FFF0 correspond à la valeur du saut à effectuer car sur cette ligne
on trouve l’instruction dbf d5, suite
Cette instruction se trouve à l’adresse $103C
La valeur du saut est calculée de la façon suivante :
A l’issue du décodage du code de l’opération sur 16 bits , c'est-à-dire
$51CD, l’instruction doit retrouver juste après, la valeur du saut, soit
$FFF0 ; cette valeur pour le saut est codée en complément à deux.
Il faut donc partir de la valeur de l’adresse après le code opération du
saut soit $103C+2=$103E qu’il faut retrancher à l’adresse à laquelle on
veut arriver c'est-à-dire l’adresse indiquée par l’étiquette « SUITE »
soit $102E (le saut est donc négatif).
La soustraction donne :
$102E
- $103E en binaire
0001 0000 0011 1110
compléme nt à deux :
1110 1111 1100 0010 ($EFC2)
Puis on additionne cette dernière valeur avec l’adresse de destination
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
10/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
$1 0 2 E
$EF C 2
$FF F 0 le résultat est négatif car le bit de poids fort est à 1.
Pour pouvoir lire la valeur directement, il faut effectuer le complément
à deux de ce résultat soit :
$FFF0 en binaire
%1111 1111 1111 0000
complément à deux %0000 0000 0001 0000
On a donc un saut de 16 octets : il ne reste plus qu’à les compter.
+
Une autre démarche consiste à évaluer la différence entre les deux lignes de
commandes (correctement !), à identifier le déplacement NEGATIF à effectuer
puis à coder ce déplacement en complément à deux.
C.1.7.synthèse) Ne répondre à cette question que si vous avez répondu à toutes les questions
précédentes ;
Proposez une modification du programme donné dans cette partie C afin de pouvoir faire la
même opération sur des opérandes de 32 bits
Remarque : Le résultat tient sur un format plus grand que celui d’origine que vous
considèrerez afin de toujours obtenir un résultat valide.
Rappel : Opération sur les chiffres décimaux codés en binaire (BCD).
ABCD ? Addition décimale sur un octet utilisant le bit X (extended carry).
Syntaxe utilisée : ABCD Dy, Dx
Additionne l’opérande source et l’opérande destination avec le contenu du bit X et
enregistre le résultat dans le registre de destination.
Registre de code condition :
ü X : Positionné à la même valeur que la retenue C
ü N : Non utilisé
ü Z : Mis à zéro si le résultat est différent de zéro, sinon inchangé.
ü V : Non utilisé
ü C : Mis à un si une retenue décimale est générée, sinon mis à zéro.
That’s all Folks …
La correction de ce contrôle sera sur Internet
à l’adresse suivante http://francomme.fr.fm
dans la rubrique Informatique Industrielle, 68000, cours.
Bon courage …
Remarque inhérente à la solution programmée : la solution proposée fonctionne parfaitement
avec l’outil de simulation « Visual simulator » (IDE68K) mais provoque un mauvais résultat avec
l’outil de simulation BSVC.
Cela est dû à une mauvaise implémentation de l’instruction ABCD (addition BCD) qui lors
de l’addition BCD ne tient pas compte de l’indicateur X du registre CCR comme cela est donné
dans la documentation constructeur.
Ces deux outils sont accessibles à partir du site http://francomme.fr.fm rubrique informatique
industrielle, 68000, travaux pratiques/liens.
ü BSVC : Windows et linux / Unix
o Sous Windows NT, nécessite les droits administrateur
ü IDE68K / visual simulator : Windows uniquement
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
11/14
Nom : Eléments de correction
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
VAL1 EQU $35
VAL2 EQU $11
efface_X EQU $EF
Seuls les
registres
modifiés par
l’instruction
sont
représentés.
FIN
DOFOISD5
SUITE
NEXT
Registres Registres
A0
D0 A1D1A2 D5A3 D0
D6
D7
Instructions
MOVE.W
MOVE.W
MOVE.W
ANDI
#VAL1,D0
#VAL2,D1
D1,D5
#$0F,D5
BSR
MOVE.W
MOVE.W
LSR.B
ANDI.W
DOFOISD5
D6,D7
D1,D5
#4,D5
#$0F,D5
BSR
LSL.W
DOFOISD5
#4,D6
avant
après
après
après
après
après
après
après
après
après
avant
après
après
avant
après
après
avant
après
après
avant
après
après
xxxxxxxx
D6
NEXT
#efface_X,CCR
D0,D6
NEXT
ADD.W
DBF
RTS
#$0100,D6
D5,SUITE
xxxxxxxx
xxxxxxxx
xxxxxxxx
0
0
Bit X
0
$0035
$0011
$0011
$0001
$0035
$0035
$0011
$0001
$0001
après
$0035
après
$0350
après
BSR
D6PLUSD7
$0035
BRA
FIN
après
Lors du premier appel de la procédure D0FOISD5
CLR.W
BRA
ANDI
ABCD
BCC
xxxxxxxx
Bit N Bit C
$0385
$0011
$FFFF
$0385
$3500
0
0
0
$0000
après
après
0
après
$0035
après
0
0
après
après
après
$0000
$FFFF
0
PC
$00001000
$00001004
$00001008
$0000100A
$0000100E
$00001028
$00001014
$00001016
$00001018
$0000101C
$00001028
$00001022
$00001042
$00001026
$00001028
$0000102A
$0000103C
$00001032
$00001034
$0000103C
//////////////////
$102E
$1040
$00001012
après
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
$FFFF équivalent à « -1 »
12/14
Pas
exécutée
pour cet
exemple.
Nom : Eléments de correction
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
Ne sont indiqués que les indicateurs pris en considération dans l’instruction qui suit.
Registres Registres
A0
D0 A1D1 A2 D5A3 D0
D6
D7
Instructions
PC
Bit N
Bit C
Bit X
Lors du deuxième appel de la procédure D0FOISD5
DOFOISD5
SUITE
NEXT
CLR.W
BRA
ANDI
D6
NEXT
#efface_X,CCR
après
ABCD
BCC
D0,D6
NEXT
après
ADD.W
DBF
RTS
#$0100,D6
D5,SUITE
après
$00001028
$0000
après
après
0
$0035
0
0
0
après
après
$0000
$FFFF
$00001020
après
Lors de l’appel de la procédure D6PLUSD7
D6PLUSD7
ANDI
ABCD
ROR.W
#efface_X,CCR
D7,D6
#8,D6
après
ROR.W
ABCD
ROR.W
RTS
#8,D7
D7,D6
#8,D6
après
0
après
$0385
1
après
$8503
1
1
0
0
$3500
après
$8503
après
$0385
après
$0000102A
$0000103C
$00001032
$00001034
$0000103C
/////////////////
$102E $1040
$00001042
$00001046
$00001048
$0000104A
$0000104C
$0000104E
$00001050
$00001026
Dans cette colonne, la valeur du compteur de programme après l’exécution de l’instruction
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
13/14
Contrôle « Architecture des microprocesseurs » ECE – INGE3 / PREPA MASTER
Eléments de correction
Durée : 2 heures - mars 2003
Annexe 1 – Fichier listing de l’application partie C
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000 =00001000
00000000 =00000035
00000000 =00000011
00000000 =000000EF
00000000
00000000
00000000
00000000
00000000
00000000
00000000 00008000
00000004 00001000
00000008
00000008
00000008
00000008
00000008
00001000
00001000
00001000
00001000
00001000
00001000
00001000 303C 0035
00001004 323C 0011
00001008 3A01
0000100A 0245 000F
0000100E 6100 0018
00001012 3E06
00001014 3A01
00001016 E80D
00001018 0245 000F
0000101C 6100 000A
00001020 E94E
00001022 6100 001E
00001026 60FE
00001028
00001028
00001028
00001028
00001028
00001028
00001028 4246
0000102A 6000 0010
0000102E 023C 00EF
00001032 CD00
00001034 6400 0006
00001038 0646 0100
0000103C 51CD FFF0
00001040 4E75
00001042
00001042
00001042 023C 00EF
00001046 CD07
00001048 E05E
0000104A E05F
0000104C CD07
0000104E E05E
00001050 4E75
00001052
00001052
1 **********************************************************
2 * ECE Mars 2003
3 * INGE3 - PREPA MASTER
4 * Contrôle Architecture des microprocesseurs
5 * J. FRANCOMME - http://francomme.fr.fm
6 * Etat initial du registre des flags : X N Z V C tous à 0.
7 **********************************************************
9 **********************************************************
10 * Assignations
11 **********************************************************
12 DEBPROG
EQU $1000
13 VAL1
EQU
$35
14 VAL2
EQU $11
15 efface_X
EQU $EF
16
17
18 **********************************************************
19 * Initialisation des vecteurs de démarrage
20 **********************************************************
21
ORG
$0
22
DC.L
$8000
Pointeur de pile après un reset
23
DC.L
DEBPROG
Compteur de programme (PC) après un reset
24
25
26 **********************************************************
27 * Programme principal
28 **********************************************************
29
ORG
DEBPROG
30
31 * Charger un registre d'adresse (A1) avec adresse de la zone des données
32 * Utilisation de l'adressage indirect pour le lecture des données
33
34
35
MOVE.W
#VAL1,D0
36
MOVE.W #VAL2,D1
37
MOVE.W D1,D5
38
ANDI
#$0F,D5
39
BSR
DOFOISD5
40
MOVE.W D6,D7
41
MOVE.W
D1,D5
42
LSR.B
#4,D5
43
ANDI.W
#$0F,D5
44
BSR
DOFOISD5
45
LSL.W
#4,D6
46
BSR
D6PLUSD7
47 FIN
BRA
FIN
* pour éviter l'exécution des codes qui se trouvent
48
* après le programme dans la mémoire.
49
50 **********************************************************
51 * Bibliothèques de sous-programmes
52 **********************************************************
53 DOFOISD5
54
CLR.W
D6
55
BRA
NEXT
02 3C 00 EF
56 SUITE
ANDI
#efface_X,CCR
57
ABCD
D0,D6
CD 00
58
BCC
NEXT
64 00 00 06
59
ADD.W
#$0100,D6
60 NEXT
DBF
D5,SUITE
06 46 01 00
61
RTS
51 CD
62
63 D6PLUSD7
64
ANDI
#efface_X,CCR
65
ABCD
D7,D6
66
ROR.W
#8,D6
Voilà tous les octets qu’il
67
ROR.W
#8,D7
68
ABCD
D7,D6
faut
remonter pour aller à
69
ROR.W
#8,D6
70
RTS
l’étiquette essai.
71
72
END
J. FRANCOMME [email protected] - J.M. HENRI [email protected]
14/14
Téléchargement