# Spring 2001 CSCI 255 Homework 10 Solution

## Problem 1 and only

This homework is, in style, similar to Homework 8.

Write an LC-2 assembly language subroutine that performs the C ^ operator. You should write the subroutine so that it processes its input arguments in registers R1 and R2 and returns its result in register R0.

Review your notes for the 21 March lecture to see an example that uses this argument passing style. Review your notes for the 22 January lecture for a little more information about the exclusive-OR. All you really need to know is that the following C exression is always true:

• `(A ^ B) == (A & ~B | ~A & B)`

This solution was given by Tom Albright.

```
.Orig x4000	;Tom Albright's XOR subroutine
;A B |~A |~B |~A&~B|~(~A&~B)|A&B|~(A&B)|~(~A&~B)&~(A&B)
;		  (Regular Or)		(Exclusive Or)
;0 0 | 1 | 1 |  1  |    0   | 0 |   1  |       0
;0 1 | 1 | 0 |  0  |    1   | 0 |   1  |       1
;1 0 | 0 | 1 |  0  |    1   | 0 |   1  |       1
;1 1 | 0 | 0 |  0  |    1   | 1 |   0  |       0
;XOR == A & ~B | ~A & B == ~(~A & ~B) & ~(A & B)
TomsXOR	ST	R3, Reg3	;Store original register values
ST	R4, Reg4
Not	R3, R1
Not	R4, R2
And	R3, R3, R4
Not	R3, R3		;~(~A & ~B)
And	R0, R1, R2
Not	R0, R0		;~(A & B)
And	R0, R0, R3 	;~(~A & ~B) & ~ (A & B)
LD	R3, Reg3	;Restore registers to original values
LD	R4, Reg4