Accueil
Démo
Exercices formatifs
Travaux pratiques
Simulation libre
Sessions sauvegardées

TP3: Copie mémoire

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:

  1. Comprendre comment sont effectués les transferts de programme d'une partie de la mémoire à une autre;
  2. Expérimenter avec l'appel de fonctions en assembleur ARM;
  3. Implémenter des algorithmes simples en assembleur ARM;
  4. 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:

MOV R0, #7
MOV R1, #12
BL EchangeRegistres
ASSERT R0=12,R1=7

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 !

Liens importants

Remerciements

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.

Registre Généraux (User)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13 (sp)
R14 (lr)
R15 (pc)

Registre Généraux (FIQ)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8 FIQ
R9 FIQ
R10 FIQ
R11 FIQ
R12 FIQ
R13 FIQ (sp)
R14 FIQ (lr)
R15 (pc)

Registre Généraux (IRQ)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13 IRQ (sp)
R14 IRQ (lr)
R15 (pc)

Registre Généraux (SVC)

Nom Valeur
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13 SVC (sp)
R14 SVC (lr)
R15 (pc)

État courant

 CPSRSPSR
Negatif (N)
Zero (Z)
Retenue (C)
Dépassement (V)
Ignore IRQ
Ignore FIQ

Configurations

Interruptions

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}

Instruction courante

Mémoire

Suivre PC
Cycle courant :