Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I need help with the following. I wrote the code I wrote below, but it is wrong.

ID: 3726318 • Letter: I

Question

I need help with the following. I wrote the code I wrote below, but it is wrong. I do not get the desired outcome. Can someone please look at it, fix it or write a new code that works with comments. Thank you

.ORIG x3000

LDI R3, MONTH ; m

LDI R4, DAY ; q (Day)

LDI R5, YEAR ;

;COMPUTE M

AND R1,R1,#0

AND R2,R2,#0

AND R6,R6,#0

ADD R1,R3,#0

ADD R1,R1,#-2

BRp MONTHIS2

ADD R1,R1,#12

MONTHIS2

ADD R1,R1,#0

STI R1,M

;COMPUTE D

AND R1,R1,#0

AND R2,R2,#0

AND R6,R6,#0

ADD R1,R5,#0

LD R2,N_100

JSR MOD

LDI R6,X_MOD_Y

STI R6,D

;compute c

AND R1,R1,#0

AND R2,R2,#0

AND R6,R6,#0

ADD R1,R5,#0

LD R2,N_100

JSR DIV

LDI R6,X_DIV_Y

STI R6,C

;COMPUTE THE FORMULA

AND R1,R1,#0

AND R2,R2,#0

AND R6,R6,#0 ; (13M-1)

LDI R1,M

ADD R2,R2,#13

JSR MULT

LDI R6,X_MUL_Y

ADD R6,R6,#-1

AND R1,R1,#0

AND R2,R2,#0

;(13M-1)/5

ADD R1,R6,#0

ADD R2,R2,#5

AND R6,R6,#0

JSR DIV

LDI R6,X_DIV_Y

ADD R6,R6,R4 ;K+(13M-1)/5

AND R1,R1,#0

AND R2,R2,#0

LDI R1,D

ADD R6,R6,R1 ;K+(13M-1)/5+D

AND R1,R1,#0

LDI R1,D

ADD R2,R2,#4 ;D/4

JSR DIV

AND R1,R1,#0

LDI R1,X_DIV_Y

ADD R6,R6,R1 ;K+(13M-1)/5+D +D/4

AND R1,R1,#0

AND R2,R2,#0

LDI R1,C

ADD R2,R1,R1 ;2C

NOT R2,R2

ADD R2,R2,#1

ADD R2,R2,#4 ;4-2C

JSR DIV

AND R1,R1,#0

LDI R1,X_DIV_Y

ADD R6,R6,R1 ;K+(13M-1)/5+D +D/4+C/4-2C

AND R1,R1,#0

AND R2,R2,#0

ADD R1, R6, #0

ADD R2, R2, #7

JSR MOD ; F mod 7

AND R0,R0,#0

AND R6,R6,#0

LDI R6, X_MOD_Y

STI R6,DAY_OF_THE_WEEK

LD R0,DAYS

ADD R0,R6,#0

PUTS

HALT

DAYS

.STRINGZ " Sunday "

.STRINGZ " Monday "

.STRINGZ " Tuesday "

.STRINGZ " Wendsday"

.STRINGZ " Thursday"

.STRINGZ " Friday "

.STRINGZ " Saturday"

DAY_OF_THE_WEEK .FILL x31F3

MONTH .FILL x31F0

DAY .FILL x31F1

YEAR .FILL x31F2

M .FILL x3100

D .FILL x3101

C .FILL x3102

X_MUL_Y .FILL x3103

X_DIV_Y .FILL x3104

X_MOD_Y .FILL x3105

N_100 .FILL #100

MULT

STI R1, SAVE_R1 ; Save registers

STI R2, SAVE_R2 ;

STI R3, SAVE_R3 ;

STI R4, SAVE_R4 ;

;STI R7, SAVE_R7

AND R4, R4, #0 ; Test the sign of X

ADD R1, R1, #0

BRn X_NEG ; If X is negative, change X to positive

BR #3

X_NEG

NOT R1, R1

ADD R1, R1, #1

NOT R4, R4

ADD R2, R2, #0

BRn Y_NEG ; If Y is negative, change Y to positive

BR #3 ; Change Y to positive

Y_NEG

NOT R2, R2

ADD R2, R2, #1

NOT R4, R4

AND R3, R3, #0

MULT_REPEAT

ADD R3, R3, R1 ; Perform addition on X

ADD R2, R2, #-1 ; Use R2 as the counter

BRnp MULT_REPEAT ; Continue loop while counter not equal to 0

ADD R4, R4, #0 ; Test the sign flag

BRn CHANGE_SIGN ; Change the result if sign flag is negative

BR #2

CHANGE_SIGN ; Change the sign of the result

NOT R3, R3

ADD R3, R3, #1

STI R3, X_MUL_Y ; Save the result

LDI R1, SAVE_R1 ; Restore registers

LDI R2, SAVE_R2 ;

LDI R3, SAVE_R3 ;

LDI R4, SAVE_R4 ;

RET

DIV

STI R1, SAVE_R1 ; Save registers

STI R2, SAVE_R2 ;

STI R3, SAVE_R3 ;

STI R4, SAVE_R4 ;

STI R5, SAVE_R5 ;

AND R3, R3, #0 ; Initialize the whole part counter

AND R5, R5, #0 ; Initialize the sign flag

ADD R1, R1, #0

BRn X_NEG_2 ; If X is negative, change X to positive

BR #3

X_NEG_2

NOT R1, R1

ADD R1, R1, #1

NOT R5, R5

ADD R2, R2, #0

BRn Y_NEG_2

BR #3

Y_NEG_2

NOT R2, R2

ADD R2, R2, #1

NOT R5, R5

NOT R4, R2 ; Initialize the decrement counter

ADD R4, R4, #1 ;

DIV_REPEAT

ADD R1, R1, R4 ; Subtract Y from X

BRn #2

ADD R3, R3, #1 ; Increment the whole number counter

BR DIV_REPEAT ; Continue loop while X is still greater than Y

ADD R5, R5, #0 ; Test the sign flag

BRn CHANGE_SIGN_2 ; Change the result if sign flag is negative

BR #2

CHANGE_SIGN_2 ; Change the sign of the result

NOT R3, R3

ADD R3, R3, #1

STI R3, X_DIV_Y ; Save the result

LDI R1, SAVE_R1 ; Restore registers

LDI R2, SAVE_R2 ;

LDI R3, SAVE_R3 ;

LDI R4, SAVE_R4 ;

LDI R5, SAVE_R5

RET

MOD

STI R1, SAVE_R1 ; Save registors

STI R2, SAVE_R2 ;

STI R3, SAVE_R3 ;

STI R4, SAVE_R4 ;

STI R5, SAVE_R5 ;

;STI R7, SAVE_R7

AND R5, R5, #0

ADD R1, R1, #0

BRn X_NEG_3 ; If X is negative, change X to positive

BR #3

X_NEG_3

NOT R1, R1

ADD R1, R1, #1

NOT R5, R5

ADD R2, R2, #0

BRn Y_NEG_3

BR #3

Y_NEG_3 ; If Y is negative, change Y to positive

NOT R2, R2

ADD R2, R2, #1

NOT R5, R5

NOT R3, R2 ; Initialize the decrement counter

ADD R3, R3, #1 ;

ADD R4, R1, #0 ; Initialize the modulo counter

MOD_REPEAT

ADD R1, R1, R3 ;

BRnz #2 ; If R3 cannot go into R1 exit loop

ADD R4, R4, R3 ; else continue to calculate modulo

BR MOD_REPEAT

STI R4, X_MOD_Y

LDI R1, SAVE_R1 ; Restore registers

LDI R2, SAVE_R2 ;

LDI R3, SAVE_R3 ;

LDI R4, SAVE_R4 ;

LDI R5, SAVE_R5 ;

;LDI R7, SAVE_R7 ;

RET

; Used to save and restore registers

SAVE_R1 .FILL x3500

SAVE_R2 .FILL x3501

SAVE_R3 .FILL x3502

SAVE_R4 .FILL x3503

SAVE_R5 .FILL x3504

SAVE_R6 .FILL x3505

SAVE_R7 .FILL x3506

.END

COMPUTE DAY OF THE WEEK 7.1 Problem Statement Write an LC-3 program that given the day, month and year will return the day of the week. 7.1.1 Inputs Before execution begins, it is assumed that locations x31F0, 31F1, and x31F2 contain the following x31FO The usual number of the month x31F The day of the month x31F2 The year For the example we have been using. June 1, 2005, we could use this code fragment in a different module: ORIG x31FO .FILL #6 ·FILL #1 ·FILL #2005 7.1.2 Outputs The outputs are: A number between 0 and 6 that corresponds to the days of the week, starting with Sunday should be stored in location x31F3. The corresponding name of the day is displayed on the screen 7.1.3 Example The program to be written answers this question: what was the day of the week on January 1, 1900? Answer: vabnoM

Explanation / Answer

Here is the code,

day_of_the_week.asm


.ORIG x3000

LD R7, PROMPT_AD
JSRR R7

ST R1, MONTH
ST R2, DAY
ST R3, YEAR

LD R3, MONTH
LD R4, DAY
LD R5, YEAR

   ADD R1, R1, R3
   JSR COMPUTE_M

   JSR COMPUTE_K
   JSR COMPUTE_J

CALC_X
   LD R2, M ;load M into R2
   ADD R2, R2, #1 ;ADD 1 to M store in R2
   LD R1, V_13 ;Load 13 into R1
   JSR R1_MULT_R2
   LD R1, X_MUL_Y ;load in value

; Compute R1 / 5
   LD R2, V_5
   JSR R1_DIV_R2
   LD R5, X_DIV_Y
   ST R5, V_X

CALC_Y
   LD R2, V_4
LD R1, K
   JSR R1_DIV_R2
   LD R5, X_DIV_Y
   ST R5, V_Y

CALC_Z
   LD R1, J
   LD R2, V_4
   JSR R1_DIV_R2
   LD R5, X_DIV_Y
   ST R5, V_Z

CALC_G
   LD R1, V_5
   LD R2, J
   JSR R1_MULT_R2

   LD R5, X_MUL_Y
   ST R5, V_G

ADD_ALL_SUB_PARTS
   LD R6, DAY
   LD R5, V_X
   ADD R6, R6, R5
   LD R5, K
   ADD R6, R6, R5
   LD R5, V_Y
   ADD R6, R6, R5
   LD R5, V_Z
   ADD R6, R6, R5
   LD R5, V_G
   ADD R6, R6, R5

CALC_MOD_OF_SUB_PARTS
   ADD R1, R6, #0
   LD R2, V_7
   JSR R1_MOD_R2

STORE_RESULTS
   LD R6, X_MOD_Y
   ST R6, DAY_OF_THE_WEEK

LD R3, PRINT_AD
JSRR R3
LD R3, MAIN_AD
JSRR R3
;--------------------------- LINKS ----------------------------
MAIN_AD .FILL x3000
PROMPT_AD .FILL x4000
PRINT_AD .FILL x4500

;--------------------------- START COMPUTE_M ----------------------------
COMPUTE_M
   ST R1, SAVE_R1           ; Save reigisters
   ST R2, SAVE_R2
   ST R3, SAVE_R3

   LD R1, MONTH
   ADD R3, R1, #0
   AND R2, R2, #0
   ADD R2, R2, #-2
   ADD R1, R1, R2
   BRp MONTH_GT_2
   ADD R3, R3, #10
   BR #2
   MONTH_GT_2
       ADD R3, R3, #0
   ST R3, M
   LD R1, SAVE_R1           ; Restore reigisters
   LD R2, SAVE_R2
   LD R3, SAVE_R3
   RET
;--------------------------- END COMPUTE_M ------------------------------
;--------------------------- START COMPUTE_K ----------------------------
COMPUTE_K
   ST R1, SAVE_R1           ; Save reigisters
   ST R2, SAVE_R2
   ST R3, SAVE_R3
   ST R7, SAVE_R7

   LD R1, YEAR
   LD R2, N_100
   JSR R1_MOD_R2
   LD R3, X_MOD_Y
   ST R3, K
   LD R1, SAVE_R1           ; Restore reigisters
   LD R2, SAVE_R2
   LD R3, SAVE_R3
   LD R7, SAVE_R7
   RET
;--------------------------- END COMPUTE_K ----------------------------
;--------------------------- START COMPUTE_J ----------------------------
COMPUTE_J
   ST R1, SAVE_R1           ; Save reigisters
   ST R2, SAVE_R2
   ST R3, SAVE_R3
   ST R7, SAVE_R7

   LD R1, YEAR
   LD R2, N_100
   JSR R1_DIV_R2
   LD R3, X_DIV_Y
   ST R3, J
   LD R1, SAVE_R1           ; Restore reigisters
   LD R2, SAVE_R2
   LD R3, SAVE_R3
   LD R7, SAVE_R7
   RET
;--------------------------- END COMPUTE_J ----------------------------
;--------------------------- START MUL ----------------------------
R1_MULT_R2
   ST R1, SAVE_R1           ; Save registers
   ST R2, SAVE_R2           ;
   ST R3, SAVE_R3           ;
   ST R4, SAVE_R4           ;
   ;ST R7, SAVE_R7
   AND R4, R4, #0           ; Test the sign of X
   ADD R1, R1, #0
   BRn X_NEG           ; If X is negative, change X to positive
   BR #3
   X_NEG
       NOT R1, R1
       ADD R1, R1, #1
       NOT R4, R4
   ADD R2, R2, #0
   BRn Y_NEG           ; If Y is negative, change Y to positive
   BR #3               ; Change Y to positive
   Y_NEG
       NOT R2, R2
       ADD R2, R2, #1
       NOT R4, R4
   AND R3, R3, #0
   MULT_REPEAT
       ADD R3, R3, R1       ; Perform addition on X
       ADD R2, R2, #-1       ; Use R2 as the counter
       BRnp MULT_REPEAT   ; Continue loop while counter not equal to 0

   ADD R4, R4, #0           ; Test the sign flag
   BRn CHANGE_SIGN           ; Change the result if sign flag is negative
   BR #2
   CHANGE_SIGN           ; Change the sign of the result
       NOT R3, R3
       ADD R3, R3, #1
   ST R3, X_MUL_Y           ; Save the result
   LD R1, SAVE_R1           ; Restore registers
   LD R2, SAVE_R2           ;
   LD R3, SAVE_R3           ;
   LD R4, SAVE_R4           ;
   RET
;--------------------------- END MUL ----------------------------
;--------------------------- START DIV ----------------------------
R1_DIV_R2
   ST R1, SAVE_R1           ; Save registers
   ST R2, SAVE_R2           ;
   ST R3, SAVE_R3           ;
   ST R4, SAVE_R4           ;
   ST R5, SAVE_R5           ;

   AND R3, R3, #0           ; Initialize the whole part counter
   AND R5, R5, #0           ; Initialize the sign flag
   ADD R1, R1, #0
   BRn X_NEG_2           ; If X is negative, change X to positive
   BR #3
   X_NEG_2
       NOT R1, R1
       ADD R1, R1, #1
       NOT R5, R5
   ADD R2, R2, #0
   BRn Y_NEG_2
   BR #3
   Y_NEG_2
       NOT R2, R2
       ADD R2, R2, #1
       NOT R5, R5

   NOT R4, R2           ; Initialize the decrement counter
   ADD R4, R4, #1           ;
   DIV_REPEAT
       ADD R1, R1, R4       ; Subtract Y from X
       BRn #2
       ADD R3, R3, #1       ; Increment the whole number counter
       BR DIV_REPEAT       ; Continue loop while X is still greater than Y
   ADD R5, R5, #0           ; Test the sign flag
   BRn CHANGE_SIGN_2       ; Change the result if sign flag is negative
   BR #2
   CHANGE_SIGN_2           ; Change the sign of the result
       NOT R3, R3
       ADD R3, R3, #1
   ST R3, X_DIV_Y           ; Save the result
   LD R1, SAVE_R1           ; Restore registers
   LD R2, SAVE_R2           ;
   LD R3, SAVE_R3           ;
   LD R4, SAVE_R4           ;
   LD R5, SAVE_R5
   RET
;--------------------------- START DIV ----------------------------
;--------------------------- START MOD ----------------------------
R1_MOD_R2
   ST R1, SAVE_R1           ; Save registors
   ST R2, SAVE_R2           ;
   ST R3, SAVE_R3           ;
   ST R4, SAVE_R4           ;
   ST R5, SAVE_R5           ;
   ;STI R7, SAVE_R7

   AND R5, R5, #0
   ADD R1, R1, #0
   BRn X_NEG_3           ; If X is negative, change X to positive
   BR #3
   X_NEG_3
       NOT R1, R1
       ADD R1, R1, #1
       NOT R5, R5
   ADD R2, R2, #0
   BRn Y_NEG_3
   BR #3
   Y_NEG_3               ; If Y is negative, change Y to positive
       NOT R2, R2
       ADD R2, R2, #1
       NOT R5, R5
   NOT R3, R2           ; Initialize the decrement counter
   ADD R3, R3, #1           ;
   ADD R4, R1, #0           ; Initialize the modulo counter
   MOD_REPEAT
       ADD R1, R1, R3        ;
       BRn #2           ; If R3 cannot go into R1 exit loop
       ADD R4, R4, R3       ; else continue to calculate modulo
       BR MOD_REPEAT
   ST R4, X_MOD_Y
   LD R1, SAVE_R1           ; Restore registers
   LD R2, SAVE_R2           ;
   LD R3, SAVE_R3           ;
   LD R4, SAVE_R4           ;
   LD R5, SAVE_R5           ;
   ;LDI R7, SAVE_R7           ;
   RET
;--------------------------- END MOD ----------------------------
;--------------------------- VARS ----------------------------
    MONTH   .FILL #4
    DAY   .FILL #17
    YEAR   .FILL #2016
    DAY_OF_THE_WEEK .FILL #10
; ------ Equation Vars -----
    M   .FILL #0
    J   .FILL #0
    K   .FILL #0
; ----- Constants --------
    V_13 .FILL #13
    V_5 .FILL #5
    V_4 .FILL #4
    V_7 .FILL #7
; ----- Sub parts of Equation -----
    V_X .FILL #0
    V_Y .FILL #0
    V_Z .FILL #0
    V_G .FILL #0
; ---- Holders
    X_MUL_Y .FILL #0
    X_DIV_Y .FILL #0
    X_MOD_Y .FILL #0
    N_100   .FILL #100

; ---- Registry Save Values ------
SAVE_R1 .FILL x3500
SAVE_R2 .FILL x3501
SAVE_R3 .FILL x3502
SAVE_R4 .FILL x3503
SAVE_R5 .FILL x3504
SAVE_R7 .FILL x3505


.END

print_day.asm

.ORIG x4500
   ADD R2, R6, #-1
   BRz DAY_SUNDAY

   ADD R2, R6, #-2
   BRz DAY_MONDAY

   ADD R2, R6, #-3
   BRz DAY_TUESDAY

   ADD R2, R6, #-4
   BRz DAY_WEDNESDAY

   ADD R2, R6, #-5
   BRz DAY_THURSDAY

   ADD R2, R6, #-6
   BRz DAY_FRIDAY

   BR DAY_SATURDAY

   DAY_SUNDAY
       LEA   R0,SUNDAY
       PUTS
    BR RETURN
   DAY_MONDAY
       LEA   R0,MONDAY
       PUTS
    BR RETURN
   DAY_TUESDAY
       LEA   R0,TUESDAY
       PUTS
    BR RETURN
   DAY_WEDNESDAY
       LEA   R0,WEDNESDAY
       PUTS
      BR RETURN
   DAY_THURSDAY
       LEA   R0,THURSDAY
       PUTS
      BR RETURN
   DAY_FRIDAY
       LEA   R0,FRIDAY
       PUTS
      BR RETURN
   DAY_SATURDAY
       LEA   R0,SATURDAY
       PUTS
      BR RETURN

RETURN
    LD R3, RETURN_AD
    JSRR R3

RETURN_AD .FILL x3036
SUNDAY .STRINGZ "Sunday "
MONDAY .STRINGZ "Monday "
TUESDAY .STRINGZ "Tuesday "
WEDNESDAY .STRINGZ "Wednesday "
THURSDAY .STRINGZ "Thursday "
FRIDAY .STRINGZ "Friday "
SATURDAY .STRINGZ "Saturday "
.END