I Deux triangles II Entrées/sorties de chaînes de caractères III Saisie

Transcription

I Deux triangles II Entrées/sorties de chaînes de caractères III Saisie
CC-TP - Rattrapage - LIF6 Architecture matérielle et logicielle
Consignes Ce TP est à faire tout seul. Toute communication (oral, mail, internet, etc) avec d'autres
étudiants est interdite, tout comme l'utilisation d'internet. Les sujets de TP, ainsi que les notes que vous
avez prises lors des séances précédentes, sont autorisés.
1. Vous devrez produire les chiers suivants : tri.asm, saisiech.asm, saisnum.asm.
2. Vous créerez une archive .tgz avec la commande :
tar cvfz nom.tgz tri.asm saisiech.asm saisnum.asm AUTHORS
3. Ce chier tgz devra être envoyé en n de TP à l'adresse email spéciée par votre chargé de TP. Vous
attribuerez comme sujet de l'email : CC-TP LIF6 : Nom1, Nom2 .
I
Deux triangles
Ecrire un programme tri1.asm qui saisit un entier nb compris entre 1 et 9 (assurez vous que l'utilisateur
ne peut entrer qu'un chire entre 1 et 9), et qui ache les triangles suivants, sur 2 × nb lignes de texte :
Dans l'exemple ci-dessous, nb = 3 :
***
**
*
*
**
***
II
Dans l'exemple ci-dessous, nb = 1 :
*
*
Entrées/sorties de chaînes de caractères
1. Ecrire un programme assembleur saisie_chaine.asm qui saisit une chaine de caractères et la stocke
en mémoire à partir de l'octet d'adresse 0. La saisie se terminera en appuyant sur la touche CR du
clavier (3ème ligne du clavier, dernier caractère à droite). Cette touche produit le caractère 13.
2. Complétez votre programme saisie_chaine.asm pour acher la chaine de caractères stockée.
3. Complétez votre programme an qu'il compte le nombre d'occurences du caractère 'o' dans la chaine
de caractères saisie. Si le nombre d'occurences est n, le programme achera n étoiles.
III
Saisie d'un entier quelconque en décimal
Notre processeur ne dispose pas de multiplication, ce qui est parfois génant pour réaliser des calculs.
Cela dit, on peut la programmer en remarquant que a ∗ b = a + . . . + a, b fois.
multiplie
1. Ecrire un programme assembleur mul.asm qui
les entiers (positifs) contenus dans les
registres
, et qui stocke le résultat dans le registre .
r2 et r3
r4
2. Complétez votre programme mul.asm en achant le résultat de la multiplication. On achera r4
étoiles.
Exemple : si r2 = 2 et r3 = 3, on devra obtenir l'achage : ******
saisie un entier
3. Ecrire un programme assembleur saisie_entier.asm qui
chire par chire en
partant du poids fort, et qui ache autant d'étoiles que la valeur de l'entier.
Exemple : si on entre 1, puis 0, on devra obtenir l'achage : **********
On pourra traduire le programme C suivant :
//Saisie d'un entier
entier = 0;
chiffre = saisie();
while(chiffre != 13)
entier = entier*10 + chiffre;
//Affichage de l'entier
Aide-mémoire pour la programmation sur
DigMips
Jeu d'instructions : DigMips peut adresser une mémoire de données de 8 Kio (SRAM8K) : chaque
case de la mémoire stocke 1 octet, les adresses sont codées sur 13 bits. On dispose de 8 registres 8 bits
de r0 à r7
Les instructions sont codées sur 16 bits. DigMips comporte une mémoire d'instructions (16 bits)
dans deux SRAM 8K. Pour chaque instruction, la SRAM de droite fournit les bits de 0 à 7 (poids faible)
et la SRAM de gauche fournit les bits de 8 à 15 (poids fort). Les adresses de la mémoire d'instruction sont
codées sur 13 bits. Les instructions sont les suivantes :
dest , 1 , 2 : additionne le contenu des registres r1 et r2 , et place le résultat dans le registre
rdest .
dest , 1 , 2 : calcule r1 − r2 et place le résultat dans le registre rdest .
] : charge dans le registre rdest la donnée en mémoire à l'adresse rbase + imm7,
dest , [ base +
où imm7 est un entier 7 bits. On parle aussi de valeur immédiate, puisque l'entier est immédiatement
disponible dans l'instruction.
] : stocke la valeur du registre r1 dans la mémoire à l'adresse rbase + imm7.
1 , [ base +
: si r1 ≤ r2 , saute à l'instruction située à l'adresse imm7 + 1. (sinon, on passe à
1, 2,
l'instruction suivante située à l'adresse courante plus 1). Cette instruction permet d'implémenter la
boucle for, la boucle while et le if.
: écrit l'entier 8 bits imm8 dans le registre rdest .
dest ,
,
:
saute
à
l'adresse 13 bits dénie par r1 pour les 8 bits de poids faible et par r1 pour les 5
1 2
bits restants (de poids fort).
: saute à l'adresse 13 bits imm13, où imm13 est un entier 13 bits. Cette instruction, avec
ja, permet d'implémenter les appels de fonctions.
add r r r
sub r r r
ld r r
imm7
st r r
imm7
ble r r imm7
ldi r imm8
ja r r
j imm13
Ecran et clavier :
Pour acher un caractère sur l'écran.
DigMips possède un chier supplémentaire, (io.lgf, onglet 5) qui permet de réaliser
des entrées sur le clavier et des sorties sur l'écran.
Placer le code ASCII le caractère dans un registre r, puis
exécuter st r,[un_registre + 63]. Le registre de base (un_registre) n'a pas d'importance, il faut juste
que la valeur immédiate soit 63. Par exemple :
ldi r0,'a'
// place le code ascii de 'a' dans r0
st r0,[r7+63] // affiche r0.
Pour lire un caractère au clavier. De manière analogue, il sut d'exécuter : ld r,[un_registre +
63]. Par exemple :
ld r0,[r7+63] // Lit l'état du clavier, et place le résultat dans r0
Les caractères du clavier sont stockés dans une le de taille 4. Il est possible qu'aucun caractère ne
soit disponible. Dans ce cas, on lit la valeur 0. Pour saisir un caractère au clavier, il faudra donc
boucler jusqu'à ce qu'un caractère soit disponible.
Le code ASCII du caractère de retour à la ligne est 13.