Exercices assembleur

ArchMat 06
Information
  • Ces exercices sont à réaliser en autonomie.
  • Écrire d’abord les programmes sur papier, puis utiliser le simulateur https://tinyurl.com/simordi
  • La correction est fournie.

Exercice 1

Écrire un programme qui:

  • stocke deux entiers dans la mémoire vive avec les labels val1 et val2,
  • échange ses deux valeurs.
      LDR R1, val1
      LDR R2, val2
      STR R1, val2
      STR R2, val1
      HALT
val1: 10
val2: 12

Exercice 2

Écrire un programme qui:

  • stocke dans la mémoire vive les coordonnées $x=5$ et $y=4$ d’un personnage dans un jeu.
  • modifie chaque coordonnée de 3 unités.
LDR R0, x
ADD R0, R0, #3
STR R0, x
LDR R1, y
ADD R1, R1, #3
STR R1, y
HALT
x: 5
y: 4

Exercice 3

  1. Décrire le rôle de ce programme. Il faudra décrire le déroulé des instructions, mais également donner le rôle général du programme.
  2. Tester le programme dans le simulateur. Proposer deux tests possibles afin de vérifier tous les cas de figure.
      MOV R2,#question 
      STR R2, .WriteString
      LDR R1,.InputNum
      CMP R1,#18
      BLT moins
      MOV R2,#texteplus
      STR R2, .WriteString
      HALT
moins:
      MOV R2,#textemoins
      STR R2, .WriteString
      HALT
question:.ASCIZ "Quel est votre âge?"
textemoins: .ASCIZ "Vous êtes mineur."
texteplus: .ASCIZ "Vous êtes majeur."

Le programme demande l’âge et vérifie si la personne est mineure ou majeure.

  • lignes 1-2: La question “Quel est votre âge?” est posée
  • ligne 3: Attente de l’âge et stockage dans R1
  • ligne 4: Comparaison entre l’âge et 18
  • ligne 5: Si l’âge est strictement inférieur à 18, sauter à la ligne 9
  • lignes 6-7: Afficher “Vous êtes majeur”.
  • lignes 10-11: Afficher “Vous êtes mineur.”

Exercice 4

On souhaite écrire un programme qui implémente l’algorithme suivant:

  • Demander la largeur du rectangle.
  • Demander la longueur du rectangle.
  • Calculer le périmètre du rectangle.
  • Afficher le périmètre du rectangle.

Remettre les instructions suivantes dans l’ordre afin d’implémenter l’algorithme précédent.

largeur:.ASCIZ "Quelle est la largeur?"
      STR R1, .WriteString
      ADD R4,R2,R2
      HALT
longueur: .ASCIZ "Quelle est la longueur?"
      MOV R1,#perimetre 
      STR R4, .WriteUnsignedNum
      MOV R1,#largeur 
      MOV R1,#longueur 
      STR R1, .WriteString
      LDR R3,.InputNum
      ADD R4,R4,R3
      ADD R4,R4,R3
      STR R1, .WriteString
      LDR R2,.InputNum
perimetre: .ASCIZ "Le périmètre est: "
      MOV R1,#largeur 
      STR R1, .WriteString
      LDR R2,.InputNum
      MOV R1,#longueur 
      STR R1, .WriteString
      LDR R3,.InputNum
      ADD R4,R2,R2
      ADD R4,R4,R3
      ADD R4,R4,R3
      MOV R1,#perimetre 
      STR R1, .WriteString
      STR R4, .WriteUnsignedNum
      HALT
largeur:.ASCIZ "Quelle est la largeur?"
longueur: .ASCIZ "Quelle est la longueur?"
perimetre: .ASCIZ "Le périmètre est: "

Exercice 5

Écrire un programme qui :

  • demande un nombre à l’utilisateur parmi les puissances de 2 (2, 4, 8, 16, 32, …),
  • compte le nombre de fois où on doit diviser ce nombre par 2 pour obtenir 1.
      MOV R12,#0        //nombre de divisions
      LDR R1,.InputNum  //choix du nombre
boucle:
      LSR R1,R1,#1      //divise par 2
      ADD R12,R12,#1    //incrémente compteur
      CMP R1,#1         //fin de boucle?
      BNE boucle
      STR R12, .WriteUnsignedNum //affiche la valeur
      HALT

Exercice 6

  • On souhaite écrire un programme qui demande à 10 élèves, leur durée du trajet lycée-maison (en minutes) et compte le nombre d’élèves dont le trajet dépasse 60 minutes.
  • À la fin le programme affichera ce nombre en sortie.
  • Ce nombre devra également être sauvegardé dans la mémoire vive de la machine.

Remettre les instructions dans l’ordre, afin de réaliser le programme.

      HALT
boucle:
      BNE boucle        
augmentecompteur:
      ADD R2,R2,#1      
      MOV R0,#0         //initialise le compteur
      LDR R1,.InputNum
      CMP R1,#60
      BLT augmentecompteur 
      ADD R0,R0,#1
      CMP R0,#10
      STR R2,.WriteUnsignedNum 
      MOV R2,#0         //initialise le nombre de durée
      STR R2,120       
      MOV R0,#0         //initialise le compteur
      MOV R2,#0         //initialise le nombre de durée
boucle:
      LDR R1,.InputNum
      CMP R1,#60
      BLT augmentecompteur // la valeur est <60: on ne la compte pas
      ADD R2,R2,#1      //compte la valeur
augmentecompteur:
      ADD R0,R0,#1
      CMP R0,#10
      BNE boucle        // tant qu'on n'a pas fait 10 tours
      STR R2,120        // stockage en mémoire
      STR R2,.WriteUnsignedNum // affichage
      HALT