Examen Final
Inf 2170, Groupe 10
Hiver 1996, 25 points
Durée: 1h30
À livres fermés
6pts No 1) Supposons que le registre a0
pointe une matrice
de 100 lignes et 50 colonnes de caractères. Donnez une séquence d'au
plus 14 instructions assembleur pour déterminer le nombre de colonnes
ayant seulement des espaces. Le résultat doit être placé dans le
registre d0.w
.
Solution
move.w #0,d0 move.w #49,d2 col: move.w #99,d1 movea.l a0,a1 ligne: cmpi.b #' ',(a1) bne passe lea (50,a1),a1 dbra d1,ligne add.w #1,d0 passe: lea (1,a0),a0 dbra d2,col
6pts No 2) Répondez aux questions suivantes.
3pts a) Quel est l'avantage principal de passer une matrice sous la forme d'une adresse mémoire ?
s b) Pourquoi dans le cas d'une matrice comme paramètre formel d'une sous-routine est-il nécessaire de connaître le nombre de colonnes mais pas nécessairement le nombre de lignes?
6pts No 3) Voici une fonction récursive en pseudocode. Donnez une implantation de celle-ci sous la forme d'une sous-routine assembleur. Donnez aussi l'entrée et la sortie de votre sous-routine sous la forme de commentaires au début de la sous-routine.
Fonction g(a : entier de 32 bits): entier de 32 bits; Var x, i : entier de 32 bits; Début i <- 1; x <- 0; Tantque i < a Faire Début x <- x + g(i); i <- i+1; Fin; retourner(x + 1) Fin g;
7pts No 4) Écrire une sous-routine assembleur d'au plus 20 instructions qui détermine si un nombre IEEE représente un entier. Votre fonction retourne le résultat par le bit C. Si c'est un entier il faut retourner C=1, sinon C=0.
Solution
; Entrée: d0.l nombre IEEE ; Sortie: C = 1 ssi d0.l est un entier. ; movem.l d0-d2,-(sp) move.l d0,d2 ; une copie du nombre move.w #23,d1 lsr.l d1,d0.l ; enlève la mantisse and.l #$ff,d0 ; enlève le signe du nombre beq entier ; si exposant = -127 c'est l'entier 0 sub.w #127,d0 ; obtenir le vrai exposant bmi pasEntier ; si exposant négatif => pas un entier cmp.w #23+9,d0 ; si exposant >= 23 => entier bhs entier add.w #9,d0 ; pour aussi enlever le signe et l'exposant lsl.l d0,d2 ; enlève partie entière, exposant et signe bne pasEntier ; si partie fractionnaire non zéro => pas entier entier: ori.b #1,ccr ; C <- 1 bra fin pasEntier:andi.b #$fe,ccr ; C <- 0 fin: movem.l (sp)+,d0-d2 rts