;; Lab 13 ;; ;; Team Member A: ;; Team Member B: ;; ;;;; Don't modify anything before the SYR function ;;;; It starts at the very end of the file .orig x3000 lea R6, stack lea R0, prptmes puts and R3, R3, #0 ; R3 <- 0 add R2, R3, #4 ; R2 <- 4 ld R4, cm48 inplop getc ; input loop out add R0, R0, R4 add R1, R0, #-10 brn nothex add R0, R0, #-7 and R0, R0, #15 nothex and R1, R1, #0 add R1, R1, #4 shflop1 add R3, R3, R3 ; left shift four loop add R1, R1, #-1 brp shflop1 ; end left shift loop add R3, R3, R0 add R2, R2, #-1 brp inplop ; end input loop and R0, R0, #0 add R0, R0, #10 out ;; User number has been input to R3 syrlop lea R0, syrmes ; Syracuse loop puts add r1, r3, #0 and r2, r2, #0 add r2, r2, #4 outlop and r0, r0, #0 ; output loop add r4, r0, #4 shflop2 add r0, r0, r0 ; left shift loop add r1, r1, #0 brzp noadd add r0, r0, #1 noadd add r1, r1, r1 add r4, r4, #-1 brp shflop2 ; end left shift loop add r4, r0, #-10 brzp itshex ld r4, c48 jmp prdig itshex ld r4, c55 prdig add r0, r0, r4 out add r2, r2, #-1 brp outlop ; end output loop and r0, r0, #0 add r0, r0, #10 out ;; if R3 == 1, halt add r1, r3, #-1 brnp callsyr halt ;; It's time to call the Syrcuse function SYR ;; Argument is stored in R3 ;; Build a stack frame for the call -- pretend old stack frame is of size 4 callsyr str r6, r6, #6 ; store dynamic link str r3, r6, #7 ; store the single argument add r6, r6, #4 jsr SYR ; call SYR ldr r3, r6, #4 ; load return value back into R3 ;; End of call sequence -- return value is in R3 jmp syrlop ; end of syracuse loop prptmes .stringz "Enter a four hexadecimal-digit number: " syrmes .stringz " Syracuse output: " c48 .fill #48 c55 .fill #55 cm48 .fill #-48 stack .blkw 100 ;; The divide by 2 function ;; activation record ;; 0 -- return value X/2 ;; 1 -- return address ;; 2 -- dynamic link ;; 3 -- argument X DIV2 str r7, r6, #1 ; store the return address ldr r0, r6, #3 ; R0 <- X and r1, r1, #0 ; R1 <- 0 add r2, r1, #14 ; R2 <- 14 add r0, r0, #0 brzp dv2lp add r1, r1, #1 ; R1 <- 1, if high bit of R0 set dv2lp add r1, r1, r1 add r0, r0, r0 brzp dvnost add r1, r1, #1 dvnost add r2, r2, #-1 brp dv2lp str r1, r6, #0 ; store return value ldr r7, r6, #1 ; load return address ldr r6, r6, #2 ; restore dynamic link ret ;;;; This is the SYR function -- start your modifications here SYR ldr r6, r6, #2 ret .end