INF2171 Organisation des ordinateurs et assembleur

Examen Final (25%)                                   Eté 2020

Présenté le vendredi 14 août 9h30.
A remettre le vendredi 14 août 23h59 dans Moodle.

Cet examen est personnel et individuel. Toute aide est interdite y compris les forums d'usagers.

En cas de doute, un test oral sera exigé.
Aucune question ne sera répondue par le professeur ou par les démonstrateurs.
 
Veuillez créer un document bloc-notes (NOTEPAD) appelé "final.txt" et répondre aux 4 questions suivantes:


Chapitre 9. Les sous-programmes.

Chapitre 9.1 Les sous-programmes
Chapitre 9.2 Les paramètres des sous-programmes
Chapitre 9.3.1 Adressage sur la pile (S)
Chapitre 9.3.2 Adressage indexé sur la pile (SX et SF) 
Chapitre 9.3.4 Adressage indirect indexé sur la pile (SXF) 
Chapitre 9.4 Réalisation du passage de paramètres 
Chapitre 9.5 Conventions d’utilisation des registres

Question 1)

Le programme "NOMBRES" suivant lit des nombres et appelle un sous-programme pour en faire la sommation.
Cependant l'auteur du programme a été négligent et n'a pas documenté le sous-programme SOMME.
On vous demande d'ajouter les commentaires explicatifs manquants à chaque ligne du sous-programme (18 lignes).
Bien que le programme "NOMBRES" ne soit pas selon les règles de l'art, vous ne devez pas le modifier.
 

; programme qui lit des nombres dans un tableau
; et qui appelle le sous-programme SOMME pour en faire la sommation
;
; Les débordements n'ont pas à être traités.
NOMBRES: LDX     0,i         
lecture: DECI    tableau,x   ; lecture d'un nombre
         BREQ    finlire     ; arrêt si zéro
         ADDX    2,i         ; nombre suivant
         BR      lecture     
;
finlire: LDA     tableau,i   ; adresse du tableau
         STA     -4,s        
         ASRX                ; nombre d'éléments du tableau
         STX     -2,s        
         SUBSP   4,i         ; allouer espace sur la pile
         CALL    SOMME       ; appel au sous-programme pour effectuer la sommation
         DECO    0,s         ; somme
         ADDSP   2,i         ; libérer espace sur la pile
         STOP                
;
SOMME:   SUBSP   2,i         ;
         LDA     0,i         ;
         STA     0,s         ;
         LDX     0,i         ;
addition:LDA     0,s         ;
         ADDA    4,sxf       ;
         ADDX    2,i         ;
         STA     0,s         ;
         LDA     6,s         ;
         SUBA    1,i         ;
         STA     6,s         ;
         BRGT    addition    ;
         LDA     0,s         ;
         STA     6,s         ;
         LDA     2,s         ;
         STA     4,s         ;
         ADDSP   4,i         ;
         RET0                ;
;
tableau: .BLOCK  0           
         .END                  


Chapitre 9. Les sous-programmes (allocation de mémoire NEW).

Chapitre 9.9 Sous-programme d’allocation de mémoire new (LISTE)
Chapitre 9.9 Sous-programme d’allocation de mémoire new (LISTE2)

Question 2)

Voici le programme LISTET calqué sur le programme LISTE.
Celui-ci a été modifié afin de lire des lignes de texte au terminal.
Toutefois chaque ligne de texte a une limite "généreuse" de 999 caractères ASCII.

On vous demande de modifier légèrement le programme LISTET afin de réduire le maillon à sa taille réelle.
ex: pour l'input: "salut", le texte n'occupe que 6 caractères incluant le "ENTREE" au lieu de 999.

; Programme qui manipule une liste chaînée
; Jean Privat (c) 2010
;
;                            ; // Lit la liste (à l'envers)
LISTET:  LDA     heap,i      ; ADDRSS heap
         STA     hpPtr,d     
;
         LDA     5,i         
         STA     cpt,d       
loop_in: CPA     0,i         
         BRLE    out         ; for(cpt=5; cpt>0; cpt--) {
         LDA     mLength,i   
         CALL    new         ;   X = new Maillon(); #mVal #mNext
         STX     début,d     
lecture: CHARI   mVal,x      ;   X.val = getInt();
         LDA     0,i         
         LDBYTEA mVal,x      ; lecture de la ligne caractère par caractère
         CPA     "\n",i      
         BREQ    finlire     
         ADDX    1,i         
         BR      lecture     
finlire: LDA     head,d      
         LDX     début,d     ; début du maillon
         STA     mNext,x     ;   X.next = head;
         STX     head,d      ;   head = X;
         LDA     cpt,d       
         SUBA    1,i         
         STA     cpt,d       
         BR      loop_in     ; } // fin for
;
;                            ; // Affiche la liste
out:     LDX     head,d      
loop_out:CPX     0,i         
         BREQ    fin         ; for (X=head; X!=null; X=X.next) {
         STX     début,d     
affiche: LDA     0,i         
         LDBYTEA mVal,x      
         CPA     "\n",i      
         BREQ    finaffic    
         CHARO   mVal,x      ; affichage de la ligne caractère par caractère
         ADDX    1,i         
         BR      affiche     
finaffic:LDX     début,d     
         LDX     mNext,x     
         CHARO   "\n",i      
         BR      loop_out    ; } // fin for
fin:     STOP                
head:    .BLOCK  2           ; #2h tête de liste (null (aka 0) si liste vide)
cpt:     .BLOCK  2           ; #2d compteur de boucle
début:   .BLOCK  2           ; #2h adresse du début du maillon
;
;******* Structure de liste d'entiers
; Une liste est constituée d'une chaîne de maillons.
; Chaque maillon contient une valeur et l'adresse du maillon suivant
; La fin de la liste est marquée arbitrairement par l'adresse 0
mNext:   .EQUATE 0           ; #2h maillon suivant (null (aka 0) pour fin de liste)
mVal:    .EQUATE 2           ; #1h999a valeur de l'élément dans le maillon
mLength: .EQUATE 1001        ; taille d'un maillon en octets
;
;
;******* operator new
;        Precondition: A contains number of bytes
;        Postcondition: X contains pointer to bytes
new:     LDX     hpPtr,d     ;returned pointer
         ADDA    hpPtr,d     ;allocate from heap
         STA     hpPtr,d     ;update hpPtr
         RET0                
hpPtr:   .BLOCK  2           ;#2h ADDRSS heap (address of next free byte)
heap:    .BLOCK  1           ;first byte in the heap
         .END                  


Chapitre 10.
 Programmes et sous-programmes : documentation:

Chapitre 10. Programmes et sous-programmes : documentation (FACTURE)

Question 3)

Si vous aviez à modifier le programme FACTURE pour y ajouter le traitement #8,
expliquez-moi en bon français,
sans effectuer le travail de programmation,
quelles seraient les modifications que vous devriez y apporter.

coût du traitement #8: 50$  plus 0.10$ la minute pour les 2 premières heures et 0.05$ la minute pour les minutes excédant des 2 premières heures
 


Chapitre 12. Interruptions

Chapitres 12.4 et 12.5. Interruptions de PEP8

Question 4)

Parmi les 2 programmes suivants, lequel serait le plus rapide d'exécution ?  Justifiez votre choix  ?

programme 1:
;
         CHARO   "B",i       
         CHARO   "o",i       
         CHARO   "n",i       
         CHARO   "j",i       
         CHARO   "o",i       
         CHARO   "u",i       
         CHARO   "r",i       
;
         STOP                
;
         .END                  
programme 2:
;
         STRO    bonjour,d   
;
         STOP                
;
bonjour: .ASCII  "Bonjour\x00"
         .END                  
 
Vous avez un seul document à déposer dans Moodle à la semaine 15 avant le vendredi 14 août 23h59.
-> final.txt 

N.B. Les 4 questions valent chacune 10 points pour un total de 40 points.

 

Afin de ne pas rater la remise, il vaut mieux remettre une copie temporaire durant la journée et la remplacer par la suite car la note zéro sera attribuée en cas de retard.