1/11 Université Pierre et Marie Curie Licence d’Informatique 2I004 « Machine et
1/11 Université Pierre et Marie Curie Licence d’Informatique 2I004 « Machine et Représentations » MAREP 2014-2015 Examen Durée 2 heures Le sujet comporte 3 exercices indépendants et un total de 21 questions. Le barème, donné à titre indicatif, est sur 48 points et sera ramené sur 60 par une règle de 3. Le seul document autorisé est le Memento fourni en cours. Sont interdits tous les appareils électroniques (et téléphones portables). EXERCICE 1. (14 POINTS) MANIPULATION DE MOTS BINAIRES ET RANGEMENTS MEMOIRE On considère une portion de la mémoire décrite ci-après : Adresse (de mots de 4 octets) octet Adr+3 octet Adr+2 octet Adr+1 octet Adr+0 0x2000 0000 0x00 0x00 0x00 0x00 0x2000 0004 0x01 0x23 0x45 0x67 0x2000 0008 0x00 0x00 0x00 0x00 0x2000 000C 0xFE 0xDC 0xBA 0x98 0x2000 0010 0x3C 0x0A 0x10 0x01 0x2000 0014 0xAD 0x43 0xFF 0xFC Et le contenu du registre $3 tel que : $3 = 0x20000000 Question 1 : (1 point) On souhaite affecter les valeurs suivantes aux registres $1 et $2 : $1 = 0x00000123 et $2 = 0xFFFFFEDC. En vous basant sur le contenu de la mémoire donné ci- dessus, donnez, pour chacun des registres, une instruction MIPS qui permet d'initialiser sa valeur en réalisant un accès mémoire. Rappel : en MIPS les mots mémoire sont rangés en petit boutien Question 2 : (1,5 points). On suppose $1 = 0x00000123 et $2 = 0xFFFFFEDC. Donnez la valeur, en base dix, des mots contenus dans $1 et $2 lorsqu’ils sont interprétés comme des entiers relatifs codés en complément à deux sur 32 bits. Remarque : calculer l’opposé d’un nombre négatif pour le déterminer peut être plus simple. lh $1, 6($3) lh $2, 14($3) $1 vaut 1.28 + 2.24 + 3.20 = 256 + 32 + 3 = 291 Reportez ici votre numéro d’anonymat 2/11 Question 3 : (2 points) On suppose que l’on a $1 = 0x00000123 et $2 = 0xFFFFFEDC. On réalise la séquence d’instructions suivante : ori $3, $0, 0xFFFF and $4, $3, $2 add $5, $4, $1 add $6, $2, $1 Donnez, en hexadécimal, le contenu des registres $3, $4, $5 et $6 après exécution de ces instructions en justifiant votre réponse. Les valeurs stockées dans les registres $5 et $6 sont-ils équivalents lorsque l’on considère qu’ils représentent des entiers relatifs sur 16 bits ? sur 32 bits ? Question 4 : (3 pts) On considère les mots de 4 octets implantés à partir de l’adresse 0x20000010. Quelles instructions représentent ces mots lorsqu’ils sont interprétés comme des instructions MIPS ? Calcul de l’opposé du contenu de $2 (sur 16 bits) : M2 = 1111 1110 1101 1100 Not (M2) = 0000 0001 0010 0011 +1 = 0000 0000 0000 0001 ------------------------------- Opp(M2) = 0000 0001 0010 0100 Soit Opp($2) = 1.28 + 2.24 + 4 = 292 Donc $2 = -292 R3 : 0x0000FFFF R4 : 0x0000FEDC R5 : 0x0000FFFF R6 : 0xFFFFFFFF R5 et R6 identiques sur 16 bits mais pas sur 32. 0x3C0A1001 lui $10, 0x1001 codop = 0b001111 lui, format I reg src = 0b00000 (inutilisé) reg dest = 0b01010 constante immédiate = 0x1001 0xAD43FFFC sw $3, -4($10) codop = 101011 sw, format I reg src = 0b01010 reg dest = 0b00011 constante immédiate = 0xFFFC 3/11 Question 5 : (2,5 point) On suppose que $3 = 0xFE01DC23 et on exécute les instructions suivantes : lui $10, 0x2000 sb $3, 2($10) sw $3, 12($10) Décrivez en français les actions réalisées par chacune des instructions de la séquence d’instructions. Donnez une représentation de la mémoire octet par octet après l’exécution de cette séquence. Vous indiquerez seulement le contenu des cases mémoire accédées par la séquence d’instructions. Adresse (de mots de 4 octets) octet Adr+3 octet Adr+2 octet Adr+1 octet Adr+0 0x2000 0000 0x 0x23 0x 0x 0x2000 0004 0x 0x 0x 0x 0x2000 0008 0x 0x 0x 0x 0x2000 000C 0xFE 0x01 0xDC 0x23 0x2000 0010 0x 0x 0x 0x 0x2000 0014 0x 0x 0x 0x Question 6 : (4 points) On s’intéresse à la représentation octet par octet de deux registres $1 et $2. Proposez une séquence d’instructions qui, à partir du contenu de $1 = o3o2o1o0 et $2 = odocoboa, construit le mot $3 = obo1oao0. Par exemple, si initialement $1 contient 0x0000AABB et $2 contient 0x00001122, alors $3 contiendra 0x11AA22BB à l’issue de la séquence. Vous utiliserez uniquement des décalages et opérations logiques et préciserez, pour chaque opération, le contenu du registre modifié. L’ instruction lui place la valeur 0x20000000 dans le registre R10 et l’instruction sb place l’octet de poids faible en mémoire à l’adresse 0x20000002 ; l’instruction sw place les 4 octets de R3 à partir de l’ adresse 0x2000000C $1 = 0x0000AABB et $2 = 0x00001122 Andi $3, $1, 0xFF # $3 = 0xBB Andi $13, $1, 0xFF00 # $13 = 0xAA00 Andi $4, $2, 0xFF # $4 = 0x22 Andi $14, $2, 0xFF00 # $14 = 0x1100 Sll $14, $14, 16 # $14 = 0x11000000 Sll $13, $13, 8 # $13 = 0x00AA0000 Sll $4, $4, 8 # $4 = 0x00002200 Or $3, $3, $14 # $3 = 0x110000BB Or $3, $3, $13 # $3 = 0x11AA00BB Or $3, $3, $4 # $3 = 0x11AA22BB 4/11 EXERCICE 2. (19 POINTS) PROGRAMMATION ASSEMBLEUR On souhaite réaliser un programme qui détermine le nombre de mots d’une phrase. La phrase à analyser est composée d’une suite de caractères ascii et terminée par le délimiteur 0x00. Le nombre de mots est calculé à partir des caractères espace et apostrophe qui sont les séparateurs des mots de la phrase. On suppose dans un premier temps que la phrase est bien formée : elle commence par un caractère alphabétique majuscule, les mots sont séparés par exactement un caractère espace ou apostrophe, et la phrase se termine par un point. Par exemple, les phrases « Heureux qui comme Ulysse a fait un beau voyage. » et « L’œil était dans la tombe et regardait Caïn. » sont bien formées et comprennent neuf mots chacune. Le but de cet exercice est de programmer cette fonctionnalité en assembleur MIPS. On supposera que le segment data est implanté à partir de l’adresse 0x10010000, le segment de code (.text) est implanté à partir de l’adresse 0x00400000 et le sommet de pile étant initialisé à 0x7FFFEFFC. char phrase[64]; int main(){ int i = 0; int nb_mots = 0; scanf(”%s”, phrase) ; /* appel système pour la saisie au clavier */ if (est_valide(phrase)==1){ nb_mots = 1; while(phrase[i] != ‘.’){ if (phrase[i]== ‘ ‘ || phrase[i]== ‘\’’){ // ième caractère est apostrophe ou espace nb_mots++ } i++; } printf(”%d”, nb_mots); } return 0; } Question 1. (1 point) Donnez la directive assembleur permettant d’allouer l’espace mémoire nécessaire pour le stockage de la phrase (non initialisée). Dans quel segment mémoire est implantée la phrase à l’exécution ? Question 2. (2 points) Donnez une suite d’instructions correspondant au début du programme principal jusqu’à la saisie de la phrase, c’est à dire l’extrait de programme ci-dessous. int main(){ int i = 0; int nb_mots = 0; scanf(%s, phrase) ; /* appel système pour la saisie au clavier */ Question 3. (1 point) Donnez les codes ASCII associés aux caractères espace, apostrophe et point. .text addiu $29, $29, -8 # 2 variable locales lui $4,0x1001 ori $4, $4, 0x0000 # adresse de phrase ori $5, $0, 64 # taille max de la chaine ori $2, $0, 8 # lire_string syscall 5/11 On considère uniquement dans la question suivante le comptage du nombre de mots en supposant la phrase valide soit le bout de code : nb_mots = 1; while(phrase[i] != ‘.’){ if (phrase[i]== ‘ ‘ || phrase[i]== ‘\’’){ // si caractère courant est apostrophe ou espace nb_mots++ } i++; } Pour traduire cet extrait du programme principal, vous utiliserez les registres suivants : $2 : pour compteur de mots $4 : adresse du caractère analysé $5 : valeur du caractère analysé $6 : caractère point $7 : caractère espace $8 : caractère apostrophe $9 : registre supplémentaire si indispensable (vous préciserez son rôle) Question 4. (5 points) Programmez en assembleur MIPS cet extrait du programme principal. La première instruction sera associée à l’étiquette cpt_mot. Vous utiliserez impérativement l’association des registres donnée ci-dessus, que vous initialiserez tous; vous utiliserez des étiquettes pour représenter les adresses des sauts. Vous commenterez votre programme. Espace = 0x20 Apostrophe = 0x27 Point = 0x2E cpt_mot : ori $2, $0, 1 # initialisation de $2 à 1 lui $4, 0x1001 ori $4, $4, 0x0000 ori $6, $0, 0x2E # point ori $7, $0, 0x20 # espace ori $8, $0, 0x27 # apostrophe boucle : lb $5, ($4) beq $5, $6, suite_boucle # car = point ? si oui sortir beq $5, $7, incr # car = espace ? si oui incrémenter beq $5, $8, incr # car = apo ? si oui incrémenter j fin_boucle # éviter $2++ incr :addi $2, $2, 1 fin_boucle : addiu $4, $4, 1 # passer au caractère suivant j boucle # recommencer suite_boucle uploads/Ingenierie_Lourd/ exam-corr-2014.pdf
Documents similaires










-
37
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Nov 20, 2021
- Catégorie Heavy Engineering/...
- Langue French
- Taille du fichier 0.2732MB