KHACHNAOUI ROEYA- 2L SE TD2|TP3
TP2: Manipulation des registres et opérations arithmétiques
1.Construire un programme qui commence à l'adresse $9000, et qui réalise les
tâches suivantes:
- mettre 3 dans l'octet de poids faible du registre D1
- ajouter 5 à cette valeur (commande add), et vérifier la valeur sur le simulateur
-mettre 512 dans le mot de poids faible du registre D2
-ajouter le mot de poids faible du D1 à D2
-enregistrer ce résultat dans une variable nommée sum2
- donner l'adresse et la valeur que contient cette variable
-mettre 67500 dans le registre D3
-ajouter le contenu de la variable sum2 à D3
-enregistrer ce résultat dans une variable nommée sum3
- donner l'adresse et la valeur que contient cette variable
construction de programme:
ORG $9000
START: MOVE.B #3,D1 ; mettre 3 dans l'octet de poids faible du registre D1
ADDQ.W #5,D1 ; ajouter 5 a cette valeur + ADDQ est utilisée pour ajouter une valeur rapide : quick
value a un registre
MOVE.W #512,D2 ; mettre 512 dans le mot de poids faible du registre D2
ADD.W D1,D2 ; ajouter le mot de poids faible du D1 à D2
MOVE.W D2,sum2 ; enregistrer ce résultat dans une variable nommé sum2
MOVE.L #sum2,A0 ; donner l'adresse de la variable sum2
MOVE.W sum2,D3 ; mettre 67500 dans le registre D3
ADD.L D3,A0 ; ajouter le contenu de la variable sum2 à D3
MOVE.L D3,sum3 ; enregistrer ce résultat dans une variable nommée sum3
MOVE.L #sum3,A0 ; donner l'adresse de la variable sum3
sum2: DC.W 0 ; définir la variable sum2
sum3: DC.L 0 ; définir la variable sum3
END START
2.Utiliser le simulateur pour déterminer le contenu des registres du tableau 1.1 en
suivant les étapes suivantes:
-Enregistrer la valeur hexadécimale $30A79847 a l'emplacement mémoire $1000
-Saisissez un programme assembleur contenant les instructions du tableau
suivant
- Exécuter ce programme en mode ligne par ligne et déterminer le contenu des
registres après chaque instruction.
AVANT D0=FFFFFFFF , A1=00001000
1. Donner le contenu des cases mémoires à la suite d'exécution des instructions suivantes:
ORG $2000
DC.L $11110000
ORG $3000
DC.L $22220000
ORG $20000
DC.L $11110000
ORG $30000
DC.L $00000000
TP3 : Modes d'adressage et manipulation des tableaux
Analyse d fonctionnement d'un programme
1.Saisir le programme suivant et déterminer le contenu (32 bits) des registres et des
zones mémoire qui changent au cours de la simulation. La quatrième colonne ne fait
pas partie du programme, ce sont les questions aux quelles il faut répondre dans vos
compte-rendus.
DATA:
ORG$2000
Tab1 DC.B 1,2,3,4,5 $2000=
Tab2 DC.W$1100,$2200,$3300,$4400,$5500 $2006=
Tab3 DS.W 5 $2010=
Sum DS.W 1
N DC.B 5
CODE: ORG $1000
move.b N,DO PC= ; DO=
lea.l Tab1,A1 PC= ;A1=
lea.l Tab2,A2 PC=;A2=
Lea.l Tab3,A3 PC= ;A3=
Loop1:
add.w(A2)+,D2 Donner le contenu de A2,D2 et CCRpour chaque itération
cmp A2,A3
bne Loop1
move.w D2,Sum PC= ,@Sum= adresse de Sum ; Sum= valeur de Sum
move.L #0,D7
Loop2:
clr.L D1
move.b(A1)+,D1 Donner le contenu de A1,A2,A3,D1 et D7 pour chaque itération
add.w -(A2),D1
move.w D1,(A3)+
add #1,D7
cmp.b N,D7
bne Loop2
CODE COMPLET:
Continues des registres et des zones mémoires au cours des simulations:
Fin de loop 1 A2=A3=2010:
TP4: Manipulation of character strings:
1. Compléter le programme assembleur suivant afin qu'il puisse convertir les carac-
tères minuscules du tableau tab en majuscule.
Astuce : comparer les codes ASCII des caractères majuscules et minuscules pour
en déduire la relation.
2. Dresser un tableau permettant de suivre l'état des registres et des cases mêmoire
en mode d'exécution ligne par ligne.
3. Ajouter les instructions assembleur permettant d'afficher le contenu de la variable
tab.
DATA:
ORG$2000
a DC.B $20
tab DC.B 'ABCDE',$0 $2000=
@a =
@tab=
CODE:
ORG$1000
loop1:
donner pour chaque iteration le contenu des registres et des cases mêmoires qui changent
bne loop1
* tab=...............=.........
* Affichage du contenu du tableau tab
END CODE
1 : DATA:
ORG $2000
START:
a DC.B $20 ; Définit la variable a avec la valeur hexadécimale 20
tab DC.B 'ABCDE',$0 ; Définit le tableau tab avec les caractères 'ABCDE'
CODE:
ORG $1000
loop1:
MOVE.B (A0),D1 ; Charge le contenu de l'adresse mémoire pointée par A0 dans D1
ADD.B a,D1 ; Ajoute la valeur de a à D1
MOVE.B D1,(A0)+ ; Écrit le contenu de D1 à l'adresse mémoire pointée par A0, puis
incrémente A0
compteur :
ADD.B #1,D2 ; Ajoute 1 à D2
CMP.B #5,D2 ; Compare D2 à 5
BNE loop1 ; Saute à loop1 si D2 n'est pas égal à 5
END START
memoire en iteration :
Letat des registres et des cases memoire en mode dexecution ligne par ligne :
@a=2000=20
$2000=|20|41|42|43|44|45|00
tab=61|62|63|64|65|00| =`ABCDE`
TP5: Manipulation des tableaux 2:
1. Déclarer une zone de données qui commence à l'adresse $0B000
2. créer un tablean nommé Tab1 de 5 cases d'un octet chacune. initialisées par
1,2,3,4,5
3. créer un tableau nommé Tab2 de 5 cases d'un mot chacune. initialisées par
26,27,28,29,30
4. créer un tableau SumTab de 5 mots non initialisé
5. créer un tableau ProdTab de 5 long-mots non initialisé
6. déclarer deux variables Sum et Prod de tailles respectives 16 bits et 32 bits.
Partie codes:
7. Commencer la partie code à l\'adresse $0A000
8. calculer la somme des éléments du tableau Tab1 et enregistrer cette somme dans Ia variable
Sum
9.calculer le produit des éléments du tableau Tab1 et enregistrer ce produit dans la variable Prod
10. remplir le tableau SumTab selon l'expression
SumTab[i]=Tabl[i]+Tub2[i] pour i de 1 à 5
11. remplir le tableau ProdTab selon l'expression
ProdTab[i]=Tab1[i]*Tab2[i]pour i de 1 à 5
ORG $0B000
Tab1 DC.B 1,2,3,4,5 ; Création du tableau Tab1 de 5 cases d'un octet chacune initialisées par
1,2,3,4,5
Tab2 DC.W 26,27,28,29,30 ; Création du tableau Tab2 de 5 cases d'un mot chacune initialisées
par 26,27,28,29,30
SumTab DS.W 5 ; Création du tableau SumTab de 5 mots non initialisé
créer un tableau ProdTab de 5 long-mots non initialisé:
ProdTab DS.L 5 ; Création du tableau ProdTab de 5 long-mots non initialisé
déclarer deux variables Sum et Prod de tailles respectives 16 bits et 32 bits:
Sum DS.W 1 ; Déclaration de la variable Sum de taille 16 bits
Prod DS.L 1 ; Déclaration de la variable Prod de taille 32 bits
START:
ORG $0A000
calculer la somme des éléments du tableau Tab1 et enregistrer cette somme dans la variable
Sum:
CLR.W D0 ; Initialisation du registre D0 à 0
CLR.W D1 ; Initialisation du registre D1 à 0
LEA Tab1,A0 ; Chargement de l'adresse du tableau Tab1 dans le registre A0
MOVE.B #5,D1 ; Chargement du nombre d'itérations dans le registre D1
Loop1:
MOVE.B (A0)+,D0 ; Chargement de l'élément courant du tableau Tab1 dans le registre D0
ADD.W D0,D1 ; Addition de l'élément courant au registre D1
DBNE D1,Loop1 ; Décrémentation de D1 et saut à Loop1 si D1 n'est pas égal à 0
qui peut remplacer les lignes: CMP #5,D2 ET BNE LOOP1
MOVE.W D1,Sum ; Enregistrement du résultat dans la variable Sum
calculer le produit des éléments du tableau Tab1 et enregistrer ce produit dans la variable Prod:
CLR.L D0 ; Initialisation du registre D0 à 0
CLR.W D1 ; Initialisation du registre D1 à 0
LEA Tab1,A0 ; Chargement de l'adresse du tableau Tab1 dans le registre A0
MOVE.B #5,D1 ; Chargement du nombre d'itérations dans le registre D1
Loop2:
MOVE.B (A0)+,D0 ; Chargement de l'élément courant du tableau Tab1 dans le registre D0
EXT.L D0 ; Extension de D0 en long-mot
MULU #1,D0 ; Multiplication de l'élément courant par 1
ADD.L D0,D1 ; Addition du résultat au registre D1
DBNE D1,Loop2 ; Décrémentation de D1 et saut à Loop2 si D1 n'est pas égal à 0
qui peut remplacer les lignes: CMP #5,D2 ET BNE LOOP2
MOVE.L D1,Prod ; Enregistrement du résultat dans la variable Prod
remplir le tableau SumTab selon l'expression SumTab[i]=Tab1[i]+Tab2[i] pour i de 1 à 5:
CLR.W D0 ; Initialisation du registre D0 à 0
CLR.W D1 ; Initialisation du registre D1 à 0
LEA Tab1,A0 ; Chargement de l'adresse du tableau Tab1 dans le registre A0
LEA Tab2,A1 ; Chargement de l'adresse du tableau Tab2 dans le registre A1
LEA SumTab,A2 ; Chargement de l'adresse du tableau SumTab dans le registre A2
MOVE.B #5,D1 ; Chargement du nombre d'itérations dans le registre D1
Loop3:
MOVE.B (A0)+,D0 ; Chargement de l'élément courant du tableau Tab1 dans le registre D0
EXT.W D0 ; Extension de D0 en mot
ADD.W (A1)+,D0 ; Addition de l'élément courant du tableau Tab2 à D0
MOVE.W D0,(A2)+ ; Enregistrement du résultat dans le tableau SumTab
DBNE D1,Loop3 ; Décrémentation de D1 et saut à Loop3 si D1 n'est pas égal à 0
remplir le tableau ProdTab selon l'expression ProdTab[i]=Tab1[i]*Tab2[i] pour i de 1 à 5:
CLR.L D0 ; Initialisation du registre D0 à 0
CLR.W D1 ; Initialisation du registre D1 à 0
LEA Tab1,A0 ; Chargement de l'adresse du tableau Tab1 dans le registre A0
LEA Tab2,A1 ; Chargement de l'adresse du tableau Tab2 dans le registre A1
LEA ProdTab,A2 ; Chargement de l'adresse du tableau ProdTab dans le registre A2
MOVE.B #5,D1 ; Chargement du nombre d'itérations dans le registre D1
Loop4:
MOVE.B (A0)+,D0 ; Chargement de l'élément courant du tableau Tab1 dans le registre D0
EXT.L D0 ; Extension de D0 en long-mot
MULU (A1)+,D0 ; Multiplication de l'élément courant du tableau Tab2 par D0
MOVE.L D0,(A2)+ ; Enregistrement du résultat dans le tableau ProdTab
DBNE D1,Loop4 ; Décrémentation de D1 et saut à Loop4 si D1 n'est pas égal à 0
END START
2eme methode de code :