next up previous
Next: Examen finalGroupe 40, Up: No Title Previous: Examen finalGroupe 10,

Examen final, Groupe 11, Automne 1995

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


next up previous
Next: Examen finalGroupe 40, Up: No Title Previous: Examen finalGroupe 10,

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