Question: Hello. I need help understanding the following LC3 code. The purpose of this program is to create an LC3 program that given the day, month
Hello. I need help understanding the following LC3 code. The purpose of this program is to create an LC3 program that given the day, month and year will return the week. Please place comments in the lines of code that do not have them. Some parts I already understand. Please clearly explain the steps.
.ORIG x3000
Step1
LD R3, M ;LOAD MONTH
LD R4, Y ;Load the value for Month
ADD R0, R0, R3 ;R0 <- R3
JSR MONTH ;Jumping to subroutine Month
ST R0, SAVEREG0 ;Saving the value for Month
STEP2
AND R0, R0, #0
ADD R0, R0, R4 ;R0 <- R4
JSR SEP ;SEPARATE
ST R1, SAVEREG1 ;Save ye - C
ST R0, SAVEREG2 ;Save ar - D
STEP3
;calculate (13 x (m + 1))
LD R0, SAVEREG0 ;Load month
ADD R0, R0, #1 ;M+1
AND R1, R1, #0
ADD R1, R1, #13
AND R2, R2, #0 ;R2 IS PRODUCT
JSR MULT ;R2 <- 13 X (M+1)
;calculate (13 x m - 1)/5
STEP4 AND R0, R0, #0
AND R1, R1, #0
ADD R0, R0, R2 ;R0 <- (13m)
ADD R1, R1, #5
NOT R1, R1
ADD R1, R1, #1
AND R2, R2, #0 ;R2 QUO
JSR DIVIDE ;R2 <- (13(M+1))/5
;calculate (k + (13m-1)/5)
STEP5
LDI R0, K ;LOAD K INTO R0
ADD R6, R0, R2 ;R6 <- K + (13(M+1))/5
;calculate (k + (13m-1)/5 + D)
STEP6
LD R0, SAVEREG2 ;R0 <- D
ADD R6, R6, R0 ;R6 <- K+(13(M+1))/5 + D
;calculate D/4
STEP7
AND R1, R1, #0
ADD R1, R1, #4
AND R2, R2, #0
NOT R1, R1
ADD R1, R1, #1
JSR DIVIDE ;R2 <- D/4
;calculate K+(13-1)/5+D+D/4-2C
STEP8
ADD R6, R6, R2 ;R6 <- K+(13(M+1))/5+D+D/4
;calculate -2C
LD R0, SAVEREG1 ;LOAD C INTO R0
AND R1, R1, #0
ADD R1, R1, #2
AND R2, R2, #0
JSR MULT
NOT R2, R2
ADD R2, R2, #1
;add -2C
ADD R6, R6, R2 ;R6 <- R6 -2C
STEP9
;calculate C/4
AND R1, R1, #0
ADD R1, R1, #4
NOT R1, R1
ADD R1, R1, #1
AND R2, R2, #0
JSR DIVIDE ;R2 <- C/4
;calculate K+(13-1)/5+D+D/4+C/4-2C
ADD R6, R6, R2 ;R6 <- R6 + C/4 = F
;calculate F%7
AND R0, R0, #0
AND R1, R1, #0
AND R2, R2, #0
ADD R0, R0, R6
ADD R1, R1, #7
NOT R1, R1
ADD R1, R1, #1
JSR DIVIDE ;-R3 <- F%7
ADD R3, R0, #0
STI R3, FINAL
;DISPLAY
LEA R0, DAYS
DISLOOP
ADD R3, R3, #0
BRz DISPLAY
ADD R0, R0, #10
ADD R3, R3, #-1
BR DISLOOP
DISPLAY
PUTS
HALT
MONTH
ADD R0, R0, #-2
BRnz MONTH1 ;if m<=2
BRp MONTH2 ;if m>2
MONTH1
ADD R0, R0, #14 ;if m=1 -> m=11
ADD R4, R4, #-1
RET
MONTH2
ADD R0, R0, #2 ;if m=3~12 -> m=1~10
RET
SEP
AND R3, R3, x0 ;R3 - ADDER
ADD R3, R3, #15
ADD R3, R3, #15
ADD R3, R3, #15
ADD R3, R3, #15
ADD R3, R3, #15
ADD R3, R3, #15
ADD R3, R3, #10
NOT R3, R3 ;Negate R3 to obtain positive version
ADD R3, R3, #1
AND R2, R2, #0 ;RETURN - remainder
AND R1, R1, #0 ;return - quo
BR SEPLOOP
SEPLOOP
ADD R0, R0, R3 ;R1 <- R0 - 100
BRnz SEPEND
ADD R1, R1, #1 ;Counter
BR SEPLOOP
SEPEND
NOT R3, R3
ADD R3, R3, #1
ADD R0, R0, R3 ;R0 <- REMAINDER
ADD R2, R0, R3 ;R2 <- R0 + R3 = QUO
RET
MULT
ADD R2, R2, R0
ADD R1, R1, #-1
BRz RETURN
BR MULT
DIVIDE
ADD R0, R0, R1
ADD R2, R2, #1
;COMPARE X AND Y
AND R3, R3, #0
ADD R3, R0, R1
BRn RETURN
BR DIVIDE
RETURN RET
K .FILL x31F0 ;Location for the usual number of the month
M .FILL x31F1 ;Location for Month
Y .FILL x31F2 ;Location for Year
FINAL .FILL x31F3 ;Location for Day of the week
SAVEREG0 .FILL x0 ;m
SAVEREG1 .FILL x0 ;ye - C
SAVEREG2 .FILL x0 ;ar - D
DAYS .STRINGZ "Sunday " ;Printing Sunday
.STRINGZ "Monday " ;Printing Monday
.STRINGZ "Tuesday " ;Printing Tuesday
.STRINGZ "Wednesday" ;Printing Wednesday
.STRINGZ "Thursday " ;Printing Thursday
.STRINGZ "Friday " ;Printing Friday
.STRINGZ "Saturday" ;Printing Saturday
.END
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
