It’s been a while since I’ve actually done anything with assembly code, but going through some old directories from UCR, I found some of my old assembly code. I feel like posting it to get something on the site, so here’s some of the assignments. It’s assembly for the artificial architecture called the “LC2″. If I recall correctly it was made by a professors (or a couple) at UCR and had an emulator and everything ready to rock! Last I heard they had moved on to the LC3 and who knows where they are now?! If this needs to be removed because of any similarity to current projects/classes being taught, please contact me and I will pull it down immediately!
Assignment 1
; Lab section -> 21 ;R0 = Multiplicand ;R1 = Multiplier ;R2 = Counter (8) ;R3 = x8000 For MSB test ;R4 = temp holder for lots of things ;R5 = holds mask for shifting right ;R6 = holds mask for shifting right ;R7 = Holds shifted numbers in right-shift operation .ORIG x3100 LD R0, DATA_ADDR1 ;loads data addresses and initializes values LD R1, DATA_ADDR2 LDR R0, R0, 0 ;loads data from DATA_ADDR1 LDR R1, R1, 0 ;loads data from DATA_ADDR2 LD R2, COUNTER SHIFT: ;shifts the multiplicand left BRz DONE ADD R1, R1, R1 ADD R2, R2, -1 BRp SHIFT DONE: ;re-initializes the counter variables LD R2, COUNTER COMPARE: BRz EXIT COMPARE_LSB: AND R4, R0, x0001 BRz COMPARE_MSB ADD R0, R0, R1 COMPARE_MSB: ;compares most significant bit LD R3, MSB AND R4, R0, R3 BRn SHIFT_ONE ;shifts a 1 in if msb=1 BRzp SHIFT_ZERO ;shifts a 0 in if msb=0 SHIFT_ONE: LD R3, SHFTCTR ;puts 15 in ctr variable AND R7, R7, 0 ;clears R7 for holding result AND R6, R6, 0 ;clears R6 for holding mask AND R5, R5, 0 ;clears R5 for holding mask -1 bit ADD R6, R6, 2 ;puts 2 in the mask ADD R5, R5, 1 ;puts 1 in the mask-1 O: AND R4, R6, R0 ;checks mask BRz SKIP_O ADD R7, R7, R5 ;adds mask-1 true SKIP_O: ADD R6, R6, R6 ;moves mask ADD R5, R5, R5 ;moves mask-1 ADD R3, R3, -1 ;subtracts 1 from inner counter BRp O ADD R5, R5, R5 ;shifts mask last time ADD R7, R7, R5 ;adds the 1 from mask AND R0, R0, 0 ADD R0, R0, R7 ADD R2, R2, -1 ;subtracts 1 from outer counter BR COMPARE SHIFT_ZERO: LD R3, SHFTCTR ;puts 15 in ctr variable AND R7, R7, 0 ;clears R7 for holding result AND R6, R6, 0 ;clears R6 for holding mask AND R5, R5, 0 ;clears R5 for holding mask -1 bit ADD R6, R6, 2 ;puts 2 in the mask ADD R5, R5, 1 ;puts 1 in the mask-1 Z: AND R4, R6, R0 ;checks mask BRz SKIP_Z ADD R7, R7, R5 ;adds mask-1 true SKIP_Z: ADD R6, R6, R6 ;moves mask ADD R5, R5, R5 ;moves mask-1 ADD R3, R3, -1 ;subtracts 1 from inner counter BRp Z AND R0, R0, 0 ADD R0, R0, R7 ADD R2, R2, -1 ;subtracts 1 from outer counter BR COMPARE EXIT: LD R5, RESULT_ADDR STR R0, R5, 0 HALT COUNTER .FILL x0008 NEG1 .FILL xFFFF DATA_ADDR1 .FILL x4200 DATA_ADDR2 .FILL x4201 RESULT_ADDR .FILL x4500 MSB .FILL x8000 SHFTCTR .FILL x000F .END
Assignment 2
; Lab section -> 21 ;R0 = First number ;R1 = Second number ;R2 = Subtraction (add R0 to negative of R1) ;R3 = x8000 held for checking top bit ;R4 = temp storage ;R5 = ;R6 = x8000 if R0 is negative, 0 otherwise ;R7 = x8000 if R1 is negative, 0 otherwise .ORIG x3504 LD R0, DATA_ADDR1 ;loads data addresses and initializes values LD R1, DATA_ADDR2 LDR R0, R0, 0 ;loads data from DATA_ADDR1 LDR R1, R1, 0 ;loads data from DATA_ADDR2 LD R3, ISNEG NOT R1, R1 ;converts num in R1 to negative ADD R1, R1, x0001 ;for subtraction function ADD R2, R1, R0 ;adds values to R2 LD R5, RESULT_ADDR ;gets result address STR R2, R5, 0 ;loads R2 to result address NOT R1, R1 ADD R1, R1, x0001 AND R4, R2, R3 ; RESULT CHECK BRn NUU ;x8000 if negative BRzp PUU NUU: AND R4, R0, R3 ; FIRST NUM CHECK BRn NNU ;x8000 if negative BRzp NPU NNU: AND R4, R1, R3 ;SECOND NUM CHECK BRn NNN ;x8000 if negative BRzp NNP NPU: AND R4, R1, R3 ;SECOND NUM CHECK BRn NPN ;x8000 if negative BRzp NPP NNN: AND R4, R4, 0 LD R5, VALID_ADDR ;gets validity address STR R4, R5, 0 ;loads R4 to validity address BR EXIT NNP: ;**N/A** BR EXIT NPN: AND R4, R4, 0 ADD R4, R4, 1 LD R5, VALID_ADDR ;gets validity address STR R4, R5, 0 ;loads R4 to validity address BR EXIT NPP: AND R4, R4, 0 LD R5, VALID_ADDR ;gets validity address STR R4, R5, 0 ;loads R4 to validity address BR EXIT PUU: AND R4, R0, R3 BRn PNU BRzp PPU PNU: AND R4, R1, R3 BRn PNN BRzp PNP PPU: AND R4, R1, R3 BRn PPN BRzp PPP PNN: AND R4, R4, 0 LD R5, VALID_ADDR ;gets validity address STR R4, R5, 0 ;loads R4 to validity address BR EXIT PNP: AND R4, R4, 0 ADD R4, R4, 1 LD R5, VALID_ADDR ;gets validity address STR R4, R5, 0 ;loads R4 to validity address BR EXIT PPN: ;**N/A** BR EXIT PPP: AND R4, R4, 0 LD R5, VALID_ADDR ;gets validity address STR R4, R5, 0 ;loads R4 to validity address BR EXIT EXIT: HALT DATA_ADDR1 .FILL x3500 DATA_ADDR2 .FILL x3501 RESULT_ADDR .FILL x3502 VALID_ADDR .FILL x3503 ISNEG .FILL x8000 .END
Assigment 4
; Lab section -> 21
.ORIG x3100
AND R0, R0, 0
AND R1, R1, 0
AND R2, R2, 0
AND R3, R3, 0
AND R4, R4, 0
AND R5, R5, 0
AND R6, R6, 0
AND R7, R7, 0
LD R6, NEGNUM
LD R0, RETURN
GETNUM1:
GETC
ADD R7, R0, R6
ADD R7, R7, #3
BRz NEGATIVE
ADD R7, R0, R6
ADD R7, R7, #5
BRz POSITIVE
ADD R7, R0, R6
BRn GETNUM1
BRz GETNUM2
ADD R7, R7, #-10
BRnz GETNUM2
BRp GETNUM1
GETNUM2:
ADD R1, R0, R6
OUT
GETC
ADD R7, R0, R6
BRn GETNUM2
BRz GETNUM3
ADD R7, R7, #-10
BRnz GETNUM3
BRp GETNUM2
GETNUM3:
ADD R2, R0, R6
OUT
GETC
ADD R7, R0, R6
BRn GETNUM3
BRz GETNUM4
ADD R7, R7, #-10
BRnz GETNUM4
BRp GETNUM3
GETNUM4:
ADD R3, R0, R6
OUT
GETC
ADD R7, R0, R6
BRn GETNUM4
BRz DONE
ADD R7, R7, #-10
BRnz DONE
BRp GETNUM4
POSITIVE:
OUT
AND R5, R5, 0
BR GETNUM1
NEGATIVE:
OUT
AND R5, R5, 0
ADD R5, R5, 1
BR GETNUM1
DONE:
ADD R4, R0, R6
OUT
SKIP1:
LEA R0, STABLE
ADD R0, R0, R1
LDR R1, R0, 0
LEA R0, HTABLE
ADD R0, R0, R2
LDR R2, R0, 0
LEA R0, QTABLE
ADD R0, R0, R3
LDR R3, R0, 0
LEA R0, GTABLE
ADD R0, R0, R4
LDR R4, R0, 0
AND R0, R0, 0
ADD R0, R0, R1
ADD R0, R0, R2
ADD R0, R0, R3
ADD R0, R0, R4
AND R5, R5, 1
BRnz SKIP
NOT R0, R0
ADD R0, R0, 1
SKIP:
ADD R6, R0, 0
LD R0, RETURN
OUT
; ADD R7, R6, 0
LEA R1, MASKTABLE
LD R4, COUNTER
LD R5, NEG1
LD R3, MAKENUM
LOOP:
LDR R2, R1, 0
AND R2, R6, R2
BRnp ONE
ZERO:
AND R0, R0, 0
ADD R0, R0, R3
OUT
BR COUNT
ONE:
AND R0, R0, 0
ADD R0, R0, 1
ADD R0, R0, R3
OUT
COUNT:
ADD R1, R1, 1
ADD R4, R4, R5
BRp LOOP
EXIT:
HALT
MAKENUM .FILL #48
COUNTER .FILL #16
NEG1 .FILL xFFFF
RETURN .FILL $A
RETNEG .FILL $-A
NEGNUM .FILL #-48
STABLE .FILL 0
.FILL 1000
.FILL 2000
.FILL 3000
.FILL 4000
.FILL 5000
.FILL 6000
.FILL 7000
.FILL 8000
.FILL 9000
HTABLE .FILL 0
.FILL 100
.FILL 200
.FILL 300
.FILL 400
.FILL 500
.FILL 600
.FILL 700
.FILL 800
.FILL 900
QTABLE .FILL 0
.FILL 10
.FILL 20
.FILL 30
.FILL 40
.FILL 50
.FILL 60
.FILL 70
.FILL 80
.FILL 90
GTABLE .FILL 0
.FILL 1
.FILL 2
.FILL 3
.FILL 4
.FILL 5
.FILL 6
.FILL 7
.FILL 8
.FILL 9
MASKTABLE .FILL $8000
.FILL $4000
.FILL $2000
.FILL $1000
.FILL $0800
.FILL $0400
.FILL $0200
.FILL $0100
.FILL $0080
.FILL $0040
.FILL $0020
.FILL $0010
.FILL $0008
.FILL $0004
.FILL $0002
.FILL $0001
.END
Test
.ORIG x3100 LD R1, DATA_ADDR LDR R1, R1, 0 LEA R2, 1 LD R6, NEG1 AND R4, R4, 0 LD R3, COUNTER COMPARE: BRz EXIT AND R5, R1, R2 BRz OVER ADD R4, R4, 1 OVER: ADD R2, R2, R2 ADD R3, R3, R6 BRnzp COMPARE EXIT: LD R5, RESULT_ADDR STR R4, R5, 0 HALT COUNTER .FILL x10 NEG1 .FILL xFFFF DATA_ADDR .FILL x30FE RESULT_ADDR .FILL x30FF .END