Assignment 7, Solutions
Part of
the homework for 22C:60, Fall 2009
|
A problem: Write a Hawk subroutine that takes R3 as a pointer to a memory location and reverses the order of the bytes in that location. Your code should follow all of the usual Hawk calling conventions and it should be well documented. (1 point)
REVERSE: ; reverse the order of bytes in a word
; given R3 points to the word
; returns with the bytes in that word reversed
LOADS R4,R3 ; get a copy of the word
EXTB R6,R4,R3 ; get byte 0
SL R6,8 ; shift result
ADDSI R3,R3,1 ; advance to next byte
EXTB R5,R4,R3 ; get byte 1
OR R6,R5 ; merge byte into result
SL R6,8 ; shift result
ADDSI R3,R3,1 ; advance to next byte
EXTB R5,R4,R3 ; get byte 2
OR R6,R5 ; merge byte into result
SL R6,8 ; shift result
ADDSI R3,R3,1 ; advance to next byte
EXTB R5,R4,R3 ; get byte 3
OR R6,R5 ; merge byte into result
STORES R6,R3 ; put result in memory (ignores R3 bits 0,1)
JUMPS R1 ; return
A problem: Write a Hawk program fragment equivalent to the following C-ish code to traverse the list and print the first character of each string in the list, except where the pointer to the string is null and except when the string is of length zero. (1 point)
while (R3 != NULL) {
char * T = (*R3).TEXT;
if (T != NULL) {
char CH = *T;
if (CH != NUL) dspch(CH);
}
R3 = (*R3).NEXT;
}
Note: In C, the declaration char * p declares p to be a pointer to a character. The expression *p, in this context, is the character pointed to by p. The notation o.f refers to field f of object o.
LOOP:
TESTR R3
BZS LOOPQT ; while (R3 != NULL) {
LEACC R4,R3,TEXT ; t = R4 = (*R3).TEXT
BZS ENDIFT ; if (t != NULL) {
LOADS R5,R4
EXTB R5,R5,R4 ; ch = R5 = *t;
BZS ENDIFCH ; if (ch != NUL) {
STORES R3,R2,R3SAVE ; -- must save R3
MOVE R3,R5 ; -- put ch in place as parameter
ADDI R2,R2,ARSIZE ; -- push AR
LIL R1,DSPCH
JSRS R1,R1 ; dspch( ch )
ADDI R2,R2,-ARSIZE ; -- pop ar
LOADS R3,R2,R3SAVE ; -- must restore R3
ENDIFCH: ; }
ENDIFT: ; }
LOAD R3,R3,NEXT ; R3 = (*R3).NEXT
BR LOOP
LOOPQT: ; }
x = not( a and b)
y = not( a and x)
z = not( x and b)
c = not( y and z)
a) Make a truth table showing x, y z, and c as a function of a and b. (0.5 points)
| a | b | x | y | z | c | |
|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 1 | 0 | |
| 0 | 1 | 1 | 1 | 0 | 1 | |
| 1 | 0 | 1 | 0 | 1 | 1 | |
| 1 | 1 | 0 | 1 | 1 | 0 |
b) What logic function is this? (0.5 points)
Exclusive Or