Examen Final
Inf 2170, Groupe 10
Automne 1995, 25 points
Durée: 2h
À livre ouvert
6 pts No 1) Soient le registre d0.w
contenant un nombre entier a et le registre d1.w
contenant un
entier b> 0 (les deux nombres sont codés en complément à
deux). Écrire une séquence d'au plus 10 instructions MC68K pour
placer dans le registre d2.l
la représentation en virgule fixe
[16,16] de a/b. (Il peut y avoir une perte de précision.)
Solution
Il s'agit de calculer .
move.w d0,d2 ; lsl.l #8,d2 ; décaler a lsl.l #8,d2 ; de 16 bits, i.e. a*2^16 ext.l d1 ; b sur 32 bits divs.l d1,d2 ; obtenir (a 2^16) div b
6 pts No 2) Le registre d0.l
contient une chaîne de 32
bits. Écrire une séquence d'au plus 15 instructions MC68K pour placer à
partir du bit 0 de d1.l
tous les bits à 1 de d0.l
. En
d'autres mots, d1.l
devra contenir en base 1 le nombre de bits à 1
dans d0.l
. (Exemple: si d0.l
contient
0000 0111 0011 0101 0111 0001 0001 0111
,
d1.l
devra contenir
0000 0000 0000 0000 0111 1111 1111 1111
.)
Solution
clr.l d1 ; tous les bits à 0 prchBit: lsr.l #1,d0 ; regarder le bit suivant de d0 bcc bitZero ; si bit à 0 ne pas transférer ds d1 lsl.l #1,d1 ; tasser les bits déjà transférés ori.l #1,d1 ; ajouter un bit à 1 bitZero: bne prchBit ; si d0 <> 0 continuer
6 pts No 3) Écrire une sous-routine qui accepte en
entrée une chaîne de caractères se terminant par le caractère
<nul>
et qui retourne le bit Z à 1 si et seulement s'il y a
au moins un caractère de la chaîne ayant le bit 7 à 1. Votre
sous-routine a au plus 15 instructions MC68K.
Solution
; Entrée: a0 pointe une chaîne de caractères se terminant par <nul>. ; Sortie: bit Z est à 1 si et seulement s'il y a un caractère > 127. ; DetecteCarNonStandard: movem.l a0,-(sp) prchCar: tst.b (a0)+ ; caractère <nul> ? beq finDetecte bpl prchCar ; si bit 7 à 0 regarder prochain car ori.w #4,ccr ; mettre le bit Z à 1 bra retour finDetecte: andi.w #0,ccr ; mettre le bit Z à 0 retour: movem.l (sp)+,a0 rts ; retourner à l'appeleur
7 pts No 4) Un vecteur V
est composé de 100 adresses de
32 bits, chacune pointant vers un vecteur de 50 entiers de 32
bits. Écrire une séquence d'au plus 20 instructions MC68K pour
copier ces 5000 entiers sous la forme d'une matrice de 100 lignes et
50 colonnes à l'étiquette M
telle que la première ligne de la
matrice contient les entiers du premier vecteur, la deuxième ligne les
entiers du deuxième vecteur, etc. (Les étiquettes V
et
M
sont déja définies dans la partie data
.)
Solution
lea M,a1 ; adresse de la matrice lea V,a0 ; adresse des adresses move.w #99,d0 ; 100 vecteurs à copier prchVecteur: movea.l (a0)+,a2 ; charger l'adresse d'un vecteur move.w #49,d1 ; 50 entiers à copier pour ce vecteur prchNombre: move.l (a2)+,(a1)+ ; déplacer un entier dans la matrice dbra d1,prchNombre ; prochain nombre dbra d0,prchVecteur ; prochain vecteur