next up previous
Next: Examen finalGroupe 11, Up: No Title Previous: Examen finalÉté 1996

Examen final, Groupe 10, Hiver 1996

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



Mario Latendresse
Wed Jan 15 18:27:16 EST 1997