Ce travail pratique vaut 4% de la note totale du cours. Comme le stipule le plan de cours, le travail doit être fait individuellement.
Objectifs
Ce travail pratique vise les objectifs suivants:
Comprendre comment sont effectués les transferts de programme d'une partie de la mémoire à une autre;
Expérimenter avec l'appel de fonctions en assembleur ARM;
Implémenter des algorithmes simples en assembleur ARM;
Comprendre comment fonctionnent les branchements en assembleur ARM.
Ce TP s'effectue en deux étapes : écrire du code et répondre à des question. Chacune des étapes vaut 50% de la note totale.
Étape 1: code (50% de la note)
Dans cette étape, vous aurez à implémenter 3 fonctions : EchangeRegistres, EstMultiple et CopieMemoire.
Fonction EchangeRegistres
La fonction EchangeRegistre échange le contenu des registres R0 et R1. Le code suivant (disponible dans le code fourni) vous permettra de tester le fonctionnement de votre fonction:
Après l'exécution de l'instruction BL EchangeRegistres, R0 devrait contenir 12 et R1 devrait contenir 7. Si ça n'est pas le cas, vous observerez une erreur sur le ASSERT.
Fonction EstMultiple
La fonction EstMultiple détermine si le nombre placé dans R1 est un multiple de 4 ou non. S'il est un multiple de 4, elle place 1 dans le registre R0. Dans le cas contraire, elle place 0 dans le registre R0. Comme pour la fonction EchangeRegistre, nous vous fournissons des tests pour vous permettre de valider votre fonction EstMultiple. Assurez-vous qu'elle fonctionne correctement avant de passer à la prochaine étape.
Fonction CopieMemoire
La fonction CopieMemoire doit copier une partie de la mémoire vers un autre emplacement. Cette opération est analogue à celle que fait votre ordinateur au démarrage, lorsqu'il copie d'abord une partie du système d'exploitation dans la RAM depuis votre disque dur, avant de laisser le contrôle au système en faisant un branchement vers les instructions fraichement copiées.
La fonction CopieMemoire reçoit les paramètres suivants :
R0 : Adresse de destination.
R1 : Adresse du premier mot de 32 bits à copier.
R2 : Adresse du dernier mot de 32 bits à copier.
Votre fonction doit fonctionner correctement si l'adresse du dernier mot est plus petite que celle du premier mot. Dans ce cas, aucun mot ne devrait être copié. De même, si l'adresse du dernier mot est la même que celle du premier mot, un seul mot devrait être copié. Testez ces cas vous-mêmes pour vous assurer que votre fonction respecte bien ces critères !
Toutes vos fonctions ne doivent pas modifier le contenu des registres autres que ceux qui sont utilisés comme argument de retour. Indice : vous disposez d’une pile de 32 octets, elle pourrait vous être fort utile !
Attention : dans ce TP, n'utilisez jamais les registres R7, R8 et R9. Si ces registres sont modifiés, il est possible que le reste du code ne fonctionne pas.
Afin de vous aider à déboguer votre code, il vous est possible de placer un point d'arrêt (breakpoint) directement dans la mémoire (plutôt que sur une ligne de l'éditeur de texte). Pour ce faire, cliquez sur la case mémoire correspondante tout en maintenant la touche «alt» enfoncée.
Lorsque vous avez terminé, téléchargez tout d'abord votre fichier source.txt sur votre ordinateur grâce au bouton « sauvegarder » dans le simulateur, puis téléversez ce même fichier dans la boîte de dépôt qui est disponible sur le portail des cours.
Étape 2: questions (50% de la note)
Une fois vos fonctions implémentées et testées, vous devez répondre à des questions sur le portail des cours. Chacune de ces questions est associée à un commentaire dans le code fourni qui marque l'instruction, la déclaration ou la ligne sur laquelle porte la question. Attention de ne pas effacer ces commentaires en éditant le code fourni. Contrairement au TP2, vous pouvez ajouter votre code sans craindre que cela n'affecte les réponses aux questions demandées.
Le questionnaire est disponible sur le portail des cours. N'oubliez pas de cliquer sur « soumettre » avant la date limite !
Merci à Étienne Tremblay d'avoir créé le TP original qui a servi d'inspiration pour celui-ci. Merci à Marc-André Gardner pour l'élaboration de la version « portail » du TP. Finalement, merci à Marc-André Gardner et à Yannick Hold-Geoffroy pour le simulateur ARM ! Merci à Jessica Déziel pour le design graphique.
Activer
Type
cycles
cycles (premier)
Vitesse d'exécution : ms
Français
SECTION INTVEC
B main
SECTION CODE
; Question 1
adresseDebut
; ------------------------------------------------------------------------
; Fonction fonctionMystere
; ------------------------------------------------------------------------
; Question 2
fonctionMystere
MOV R0, #0
; Question 3
MOV R1, #0x80000000
; Question 4
LSR R1, R1, #20
; Question 5
ASR R1, R1, #11
; Question 6
ADD R7, PC, #-4
boucleInterne
; Question 7
MOV LR, PC
BX R8
; Question 8
ADDS R1, R0, R1
; Question 9 et 10
MOVCS R0, #0
MOVCS R1, #1
MOV LR, PC
BX R9
CMP R0, #0
ADDEQ R1, R1, #1
; Question 11
adresseFin
MOV PC, R7
; ------------------------------------------------------------------------
; Fin de la fonction fonctionMystere
; ------------------------------------------------------------------------
; ------------------------------------------------------------------------
; Code principal
; ------------------------------------------------------------------------
main
; Préparons une pile
LDR SP, =maPile
; Question 12
ADD SP, SP, #32
; Test de la fonction EchangeRegistres
MOV R0, #7
MOV R1, #12
BL EchangeRegistres
ASSERT R0=12,R1=7
; Ne pas enlever cette ligne: ${TEST_ER}
; Tests de la fonction EstMultiple
MOV R1, #6
BL EstMultiple
ASSERT R1=6
ASSERT R0=0
MOV R1, #8
BL EstMultiple
ASSERT R1=8
ASSERT R0=1
MOV R1, #15
BL EstMultiple
ASSERT R1=15
ASSERT R0=0
MOV R1, #16
BL EstMultiple
ASSERT R1=16
ASSERT R0=1
; Autre test de la fonction EstMultiple avec un nombre plus grand.
; Le nombre de cycles nécessaires pour calculer ne devrait pas dépendre
; de la taille du nombre donné en entrée!
MOV R1, #0x120000
BL EstMultiple
ASSERT R0=1
; Ne pas enlever cette ligne: ${TEST_EP}
; Test de la fonction CopieMemoire
LDR R1, =varTestCopieMemoire1
ADD R2, R1, #0x8
LDR R0, =espaceTestCopieMemoire1
BL CopieMemoire
ASSERT 0x1010=0x67,0x1011=0x45,0x1012=0x23,0x1013=0x01
ASSERT 0x1014=0xAB,0x1015=0x89,0x1016=0x67,0x1017=0x45
ASSERT 0x1018=0xBC,0x1019=0x9A,0x101A=0x78,0x101B=0x56
ASSERT 0x101C=0x0
; Second test de la fonction CopieMemoire
LDR R1, =varTestCopieMemoire2
MOV R2, R1
LDR R0, =espaceTestCopieMemoire2
BL CopieMemoire
ASSERT 0x11C4=0x67,0x11C5=0x45,0x11C6=0x23,0x11C7=0x01
ASSERT 0x11C8=0x0
; Ne pas enlever cette ligne: ${TEST_CM}
; Copier EchangeRegistres en mémoire
LDR R1, =EchangeRegistres
LDR R2, =FinEchangeRegistres
LDR R0, =echangeRegistresEnRAM
BL CopieMemoire
; Test de EchangeRegistres en mémoire
MOV R0, #98
MOV R1, #35
BL echangeRegistresEnRAM
ASSERT R0=35,R1=98
; Copier EstMultiple en mémoire
LDR R1, =EstMultiple
LDR R2, =FinEstMultiple
LDR R0, =estMultipleEnRAM
BL CopieMemoire
; Test de EstMultiple en mémoire
MOV R1, #6
BL estMultipleEnRAM
ASSERT R1=6
ASSERT R0=0
MOV R1, #8
BL estMultipleEnRAM
ASSERT R1=8
ASSERT R0=1
MOV R1, #15
BL estMultipleEnRAM
ASSERT R1=15
ASSERT R0=0
MOV R1, #16
BL estMultipleEnRAM
ASSERT R1=16
ASSERT R0=1
; Charger l'adresse de fonctions dans R8 et R9
; NE PAS MODIFIER R7, R8, NI R9 !
LDR R8, =echangeRegistresEnRAM
LDR R9, =estMultipleEnRAM
; Effectuer une copie mémoire
LDR R1, =CopieMemoire
LDR R2, =FinCopieMemoire
LDR R0, =copieMemoireEnRAM
; Question 13
BL CopieMemoire
; Effectuer une copie mémoire
; Question 14
LDR R1, =adresseDebut
LDR R2, =adresseFin
LDR R0, =fonctionEnRAM
; Question 15 et 16
BL copieMemoireEnRAM
; Question 17
LDR R2, =fonctionEnRAM
MOV PC, R2
; ------------------------------------------------------------------------
; Fin du code principal
; ------------------------------------------------------------------------
; ------------------------------------------------------------------------
; Fonction EchangeRegistres
; ------------------------------------------------------------------------
EchangeRegistres
; La fonction EchangeRegistres échange les registres R0 et R1, sans
; toutefois modifier le contenu d'autres registres.
; Écrivez le code de votre fonction EchangeRegistres ici.
FinEchangeRegistres ; ne rien écrire entre FinEchangeRegistres et BX LR
BX LR
; ------------------------------------------------------------------------
; Fin de la fonction EchangeRegistres
; ------------------------------------------------------------------------
; ------------------------------------------------------------------------
; Fonction EstMultiple
; ------------------------------------------------------------------------
EstMultiple
; La fonction EstMultiple détermine si le nombre placé dans R1 est
; un multiple de 4 ou non.
; S'il est un multiple de 4, elle place 1 dans R0.
; Sinon, elle place 0 dans R0.
; Écrivez le code de votre fonction EstMultiple ici.
FinEstMultiple ; ne rien écrire entre FinEstMultiple et BX LR
BX LR
; ------------------------------------------------------------------------
; Fin de la fonction EstMultiple
; ------------------------------------------------------------------------
; ------------------------------------------------------------------------
; Fonction CopieMemoire
; ------------------------------------------------------------------------
CopieMemoire
; La fonction CopieMemoire reçoit les paramètres suivants:
; R0: Adresse de destination
; R1: Adresse du premier mot de 32 bits à copier
; R2: Adresse du dernier mot de 32 bits à copier
; Écrivez le code de votre fonction CopieMemoire ici.
FinCopieMemoire ; ne rien écrire entre FinCopieMemoire et BX LR
BX LR
; ------------------------------------------------------------------------
; Fin de la fonction CopieMemoire
; ------------------------------------------------------------------------
SECTION DATA
stockageTemporaire ALLOC32 1
varTestCopieMemoire1 ASSIGN32 0x01234567, 0x456789AB, 0x56789ABC
espaceTestCopieMemoire1 ALLOC32 3
stockageTemporaire1 ASSIGN32 0
; Espace mémoire pour les fonctions
echangeRegistresEnRAM ALLOC32 16
estMultipleEnRAM ALLOC32 16
copieMemoireEnRAM ALLOC32 32
; Question 18
fonctionEnRAM ALLOC32 32
; Question 19
maPile ALLOC32 8
varTestCopieMemoire2 ASSIGN32 0x01234567
espaceTestCopieMemoire2 ALLOC32 1
stockageTemporaire2 ASSIGN32 0
; Ne pas enlever cette ligne: ${TEST_DATA}