TITLE "ex2code.a by Douglas W. Jones, arithmetic done with logic" ; Code written as a basis for questions on midterm exam 2, Spring 2024, ; CS:2630 (Computer Organization), University of Iowa. USE "hawk.h" USE "stdio.h" ; Add function, done entirely with logic; ; this is based on carry-save addition using half-adders. ADD: ; expects R3 = a ; R4 = b ; uses R5 = c ; returns R3 TESTR R4 BZS ADDQT ; if (b != 0) { ADDLP: ; do { MOVE R5,R3 AND R5,R4 ; c = a and b EQU R3,R4 NOT R3 ; a = a xor b MOVESL R4,R5,1 ; b = c << 1 BZR ADDLP ; } until b == 0 ADDQT: ; } JUMPS R1 ; return a ; subtract function, done entirely with logic; ; this is inspired by carry-save addition using half-adders, slightly modified. SUB: ; expects R3 = a ; R4 = b ; uses R5 = c ; returns R3 TESTR R4 BZS SUBQT ; if (b != 0) { SUBLP: ; do { MOVE R5,R3 NOT R5 ; -- adding this line turns ADD into SUB AND R5,R4 ; c = ~a and b EQU R3,R4 NOT R3 ; a = a xor b MOVESL R4,R5,1 ; b = c << 1 BZR SUBLP ; } until b == 0 SUBQT: ; } JUMPS R1 ; return a ; Fibonacci code to test ADD and SUB functions ;RETAD = 0; I = 4; ARSIZE = 8; FIB: ; expects R3 = i STORES R1,R2 ADDSI R2,ARSIZE CMPI R3,1 BLE FIBQ ; if (i > 1) { // recursive case STORE R3,R2,I-ARSIZE ; -- save i LIS R4,1 ; -- param JSR R1,SUB ; -- sub( i, 1 ) JSR R1,FIB ; -- fib( i - 1 ) LOAD R4,R2,I-ARSIZE STORE R3,R2,I-ARSIZE ; -- save fib( i - 1 ) MOVE R3,R4 ; -- param i LIS R4,2 ; -- param JSR R1,SUB ; -- sub( i, 2 ) JSR R1,FIB ; -- fib( i - 2 ) LOAD R4,R2,I-ARSIZE ; -- param fib( i - 1 ) JSR R1,ADD ; i = add( fib( i - 2 ), fib( i - 1 ) ) FIBQ: ; } ADDSI R2,-ARSIZE LOADS PC,R2 ; return i; ; Main program, prints a line of Fibonacci numbers INT MAIN S MAIN ;RETAD = 0; ARSIZE = 4; MAIN: STORES R1,R2 ADDSI R2,ARSIZE LIS R8,0 ; i = 4 MAINLP: ; do { MOVE R3,R8 ; -- param i JSR R1,FIB ; -- param( fib( i ) ) LIS R4,5 ; -- param 5 LIL R1,PUTDEC JSRS R1,R1 ; putdec( fib( i ), 5 ) ADDSI R8,1 ; i ++ CMPI R8,15 BLT MAINLP ; } while (i < 15) ADDSI R2,-ARSIZE LOADS PC,R2 ; return END