Examen Final
Inf 2170, Groupe 11
Automne 1995, 25 points
Durée: 2h
À livre ouvert
6pts No 1) Écrire une sous-routine en MC68K
qui retourne la valeur arrondie d'un nombre y codé en
virgule-fixe [16,16]. La valeur retournée, i.e. l'arrondi, doit être
aussi codée en virgule-fixe [16,16]. L'arrondi de y est la valeur
pour
et
si
y<0. ( Par exemple, 2.5 donne 3, 12.2 donne 12, 4.9 donne
5, -2.4 donne -2, -4.9 donne -5). Votre sous-routine doit
avoir un maximum de 10 instructions.
Solution
; Entrée: d0.l nombre y ; Sortie: d0.l l'arrondi de y selon la définition donnée. ; (note: la définition de l'arrondi n'est pas ``standard'') ; Arrondi: tst.l d0 ; négatif ? bpl positif ; oui => traite cas positif neg.l d0 ; mettre positif add.l #32768,d0 ; ajouter 0.5 (codé en [16,16]) andi.l #$ffff,d0 ; tronquer la partie fractionnaire neg.l d0 ; remettre négatif bra fin positif: add.l #32768,d0 ; ajouter 0.5 andi.l #$ffff,d0 ; enlever la partie fractionnaire fin: rts
6 pts No 2) Le registre d0.l
contient une
chaîne de 32 bits qui dirige une voiture dans le plan. En lisant la
chaîne du bit 0 à 31, un bit à 1 en position paire indique d'avancer
un cm à droite et un bit à 1 en position impaire indique d'avancer un
cm à gauche. Si le bit est à 0 la voiture avance d'un cm vers
l'avant. Écrire une séquence d'au plus 15 instructions pour calculer
le nombre de cms vers la gauche, où la voiture se trouve par
rapport au point de départ, après son déplacement dirigé. Le résultat
se retrouve dans le registre d1.w
. (Remarque: le résultat est
négatif si la voiture se retrouve à droite par rapport au point de
départ.)
Solution
clr.w d1 ; 0 cm à gauche du point de départ prchBit: tst.l d0 ; positionne les bits Z et N beq fini ; c'est fini si aucun bit à 1 lsr.l #1,d0 ; bit C contient le bit sortant bcc pasAdroite ; si bit sortant 0 => va vers l'avant add.w #-1,d1 ; sinon => va vers la droite pasAdroite: lsr.l #1,d0 ; bit C contient le bit sortant bcc prchBit ; si bit sortant 0 => va vers l'avant add.w #1,d0 ; sinon => va vers la gauche bra prchBit fini: ; d1.w contient le nombre de cms à gauche
6 pts No 3) Le registre a0
pointe une zone
mémoire contenant trois champs. Le premier champ est un octet, le
deuxième un nombre entier de 32 bits codé en complément à deux et le
troisième une adresse de 32 bits pointant vers une autre zone de trois
champs ayant le même format (cette description est donc récursive).
L'octet indique l'opération à effectuer: 1 indique de faire une
addition, 2 une opération de multiplication, 3 une opération de
soustraction et 0 de ne pas faire d'opération mais de simplement
retourner l'entier du deuxième champ. Cette opération est effectuée
entre l'entier (premier argument) et la valeur provenant du traitement
semblable appliqué sur la zone pointée par le troisième champ.
Écrire une sous-routine d'au plus 20 instructions qui fait l'évaluation
demandée et place le résultat dans le registre d0.l
.
Solution
; Entrée: a0 pointe une zone de trois champs. ; Sortie: d0 contient la valeur de l'évaluation de la zone. ; Evaluer: movem.l a0/d1,-(sp) move.l 1(a0),d0 ; prendre le premier opérande cmp.b #0,(a0) ; opérateur ? beq fin movea.l 5(a0),a0 ; prendre l'adresse de l'autre zone jsr Evaluer ; évaluer récursivement le second opérande movea.l 4(sp),a0 ; reprendre le a0 move.l d0,d1 ; garder le second opérande move.l 1(a0),d0 ; reprendre le premier opérande cmpi.b #1,1(a0) ; addition ? beq addition cmpi.b #2,1(a0) ; multiplication ? beq mult sub.l d1,d0 ; sinon soustraction. bra fin addition: add.l d1,d0 bra fin mult: muls.l d1,d0 fin: movem.l (sp)+,a0/d1 rts
7 pts No 4) Écrire une sous-routine qui accepte une
matrice M de 100 lignes par 800 colonnes d'entiers de 16 bits et qui
retourne une matrice de 100 lignes par 800 colonnes de
bits, telle que
si et seulement si
.
La matrice retournée
est compactée en mémoire: huit
éléments occupent 8 bits, i.e. un octet. L'élément
occupe le bit 0 du premier octet, etc. Votre sous-routine a au plus 20
instructions MC68K.
Solution
; Entrée: a0 pointe une matrice de 100 lignes par 800 colonnes ; d'entiers de 16 bits. (matrice M) ; a1 pointe une zone pour stocker une matrice de bits de ; 100 lignes et 100 colonnes. (matrice M') ; Sortie: ; Compacte: movem.l a0-a1/d0-d2,-(sp) move.w #100*100,d0 ; 10000 octet dans M' prch8bits: clr.b d1 ; au départ les 8 bits sont à 0 move.w #7,d2 ; 8 bits à générer unOctet: lsl.b #1,d1 ; tasser les bits déjà générés tst.w (a0)+ ; est-ce un zéro dans M ? beq bitAzero ; oui => ne pas mettre le bit à 1 ori.b #1,d1 ; non => mettre le bit à 1 bitAzero: dbra d2,unOctet ; move.b d1,(a1)+ ; placer les 8 bits dans M' dbra d0,prch8bits movem.l (sp)+,a0-a1/d0-d2 rts