| Exam 3: FinalSolutions and Commentary
    
     Part of 
      
      the homework for 22C:60, Spring 2005
      
     
      | 
                           X
Median = 11.6            X X
                       X X X
                       X X X       X
           X       X   X X X X X   X
___________X_X_X_X_X_X_X_X_X_X_X_X_X__________
  0 . 2 . 4 . 6 . 8 . 10. 12. 14. 16. 18. 20
Mean   = 23.98                  X
Median = 23.7           X X X X X
                    X   X X X X X           X
______X_X_X_______X_X_X_X_X_X_X_X_X_X___X___X_X___X_X___________
 10. 12. 14. 16. 18. 20. 22. 24. 26. 28. 30. 32. 34. 36. 38. 40
                X              
Mean =   10.71  X              
Median = 10.0   X     X       X
                X   X X   X   X
                X   X X   X X X X X         X
  __________X_X_X___X_X_X_X_X_X_X_X_________X__________
   0 . 2 . 4 . 6 . 8 . 10. 12. 14. 16. 18. 20. 22. 24.
Mean   = 20.92                  X
Median = 21.7         X         X X     X   X
                      X       X X X X X X   X
______X_X_X_X___X___X_X___X_X_X_X_X_X_X_X___X___X_______ 
 6 . 8 . 10. 12. 14. 16. 18. 20. 22. 24. 26. 28. 30. 32
Mean   = 55.61                         X
Median = 54.6                    X     X
                     X X     X   X X X X   X
_______X_____X_X___X_X_X_X_X_X_X_X_X_X_X_X_X_X_________X_X_____X______
  24. 28. 32. 36. 40. 44. 48. 52. 56. 60. 64. 68. 72. 76. 80. 84. 88
         D D D           C C C         B B B           A A A
| inputs | outputs | |||||
| ai | bi | ci | pi | gi | si | |
| 0 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 1 | 0 | 0 | 1 | |
| 0 | 1 | 0 | 1 | 0 | 1 | |
| 0 | 1 | 1 | 1 | 0 | 0 | |
| 1 | 0 | 0 | 1 | 0 | 1 | |
| 1 | 0 | 1 | 1 | 0 | 0 | |
| 1 | 1 | 0 | 1 | 1 | 0 | |
| 1 | 1 | 1 | 1 | 1 | 1 | |
a) Complete the truth table for this adder in the blanks to the right (2 points)
The answers are shown in italics in the table. Many got the generate entry correct, but the propogate entry proved more difficult. In general, a carry will propogate from carry in to carry out if either the a or b inputs is one.
b) Give the logic diagram for pi as a function of ai, bi and ci. (2 points)

1 got this exactly, and half the class were corect in terms of the answer the student gave to part a). Of the remainder, many were partially correct.
c) Give a logic diagram for the ci+1 output as a function of pi, gi and ci. (2 points)

7 did well here, mostly by deriving the correct logic from the original English description. As many produced the correct values of carry out, although apparently more by accident than anything else, and as many more had significant errors. About a quarter of the class earned no credit.
| FF100004 | 
 | Keyboard status and control register | ||||||||||||||||
| IE = interrupt enable (control) | ||||||||||||||||||
| ER = error (status) | ||||||||||||||||||
| RD = input data ready (status) | ||||||||||||||||||
a) Write Hawk code for a polling loop that blocks until the RD bit is set. Use hex constants for the memory address and bit number. (2 points)
          LIW     R4,#FF100004
  LP:     LOADS   R3,R4
          TSTB    R3,7
          BCR     LP
17 did well here. The most common error was to fail to load the correct address. The second most common error was to fail to use the correct memory addressing instruction.
b) Write Hawk code to set the IE bit. Use hex constants for the memory address and bit number. (1 point)
          LIW     R4,#FF100004
          LIS     R3,#80
          STORES  R3,R4
Only 2 did well here. Many stored something in the wrong place in memory, a few wrote code to toggle the bit, and a remarkable number copied code from part a) that incorporated some kind of polling loop.
c) Even if the IE bit is set to one and a key has been pressed, interrupts may still be prevented. What other status bit or bits control whether the keyboard (and other devices) will be able to cause an interrupt? (1 point)
The top 4 bits of the processor status word, the level field, are used on the Hawk as a global interrupt enable field.
About 3 gave this answer, and one more simply commented on a global interrupt enable bit for partial credit. It is true that interrupts will not occur if the ready bit is not set, and many gave this answer, but a little care in reading the question will show that the ready bit is assumed to be set ("even if a key has been pressed"). The error bit does not inhibit interrupts! This was the most common entirely wrong answer given.
a) Write SMAL Hawk assembly code to create AA and (if necessary) PAA. (1 point)
          COMMON AA,128
  PAA:    W      AA
12 did well here, while almost as many had trouble with the size of the common block but were otherwise correct. The block size is given in bytes, while the array was described as being 32 words!
b) Write SMAL Hawk assembly code to load the address of AA into R3. (1 point)
          LOAD    R3,PAA
13 did well here. Typical errors involved one too many or one too few levels of indirection (loading the address of PAA with LEA, or loading the contents of the first location in AA).
c) Write SMAL Hawk assembly code to set all 32 words of AA to zero, given that you have loaded the address of AA into R3. (2 points)
          LIS     R4,32      ; load loop counter
  L:      STORES  R0,R3      ; clear one location in array
          ADDSI   R3,4       ; advance pointer to next location
          ADDSI   R4,-1      ; decrement count of locations remaining
          BGT     L          ; iterate
3 did well here. The most common errors involved failure to advance the memory address by 4 for each word loaded; over 20 made this error. Miscounting the number of memory locations was also common, with over 10 making this error. Over 15 failed to properly store zero in some memory location.
a) Write plausable definitions for the identifiers LEFT, RIGHT and PUTVAL, likely to be found in the SMAL header file for the abstract tree-node class. These are identifiers are displacements into the class descriptor. (1 point)
LEFT = 0 RIGHT = 4 PUTVAL = 8
16 did well here. There was little partial credit. 12 had EXT directives and similar material, while the remainder had strange answers. Note that this question was closely tied to the final machine problem. Students who had studied the materials distributed for that assignment should have had an easy time here.
b) Write appropriate definitions for the identifiers associated with the activation record of a SMAL Hawk routine that does a recursive traversal of a binary tree created using these classes. Assume the usual parameter passing conventions for the Hawk. (1 point)
RA = 0 P = 4 ARSIZE = 8
15 did well here, not necessarily giving the most sensible local variables but at least giving something that passed the basic test as an appropriate definition of an activation record in assembly language, in the style used throughout the semester.
c) Write the code to do an in-order recursive traversal of this tree, assuming the activation record and class description structures outlined in parts a and b and assuming the usual calling conventions for the Hawk. (With no optimization and pure cookbook coding, this takes 21 instructions; comments are provided for the first third of the code to serve as a guide). (4 points)
  TRAV:   STORES  R1,R2          ; save return address
          STORE   R3,R2,P        ; save pointer to node
          LOADS   R1,R3          ; get pointer to class description
          LOAD    R1,R1,LEFT     ; get pointer to LEFT method
          ADDI    R2,R2,ARSIZE   ; push activation record
          JSRS    R1,R1          ; call LEFT method
          ADDI    R2,R2,-ARSIZE  ; pop activation record
          TEST    R3
          BZS     NOLEFT         ; if left pointer not null
          ADDI    R2,R2,ARSIZE
          JSR     R1,TRAV        ;   recursive call on left node
          ADDI    R2,R2,-ARSIZE
  NOLEFT:
          
          LOAD    R3,R2,P
          LOADS   R1,R3
          LOAD    R1,R1,PUTVAL
          ADDI    R2,R2,ARSIZE
          JSRS    R1,R1          ; call p.putval()
          ADDI    R2,R2,-ARSIZE
          LOAD    R3,R2,P
          LOADS   R1,R3
          LOAD    R1,R1,RIGHT 
          ADDI    R2,R2,ARSIZE
          JSRS    R1,R1          ; call p.right()
          ADDI    R2,R2,-ARSIZE
          TEST    R3
          BZS     NORIGHT        ; if right pointer not null
          ADDI    R2,R2,ARSIZE
          JSR     R1,TRAV        ;   recursive call on right node
          ADDI    R2,R2,-ARSIZE
  NORIGHT:
          LOADS   R1,R2
          JUMPS   R1             ; return
There were no fully correct answers. A fair number had the recursion scheme correct except for termination tests (there are two reasonable termination tests; the one given is compatible with the comments that were included in the exam, on the first 7 lines above). Several had no recursive calls, or attempted a fully iterative solution. Others had some traversal order other than inorder, typically trying to visit the node after visiting both children.