Code:
;; r0 always contains 0
;; r14 stack pointer
;; r30 frame pointer
;; r31 return address
.global _exit
.global _open
.global _close
.global _read
.global _write
.global _printf
.global _a
.global _main
.align 4
_a:
.word 46
LC0:
.ascii "Value of a is %d\12\0"
.align 4
LC1:
.ascii "Counter: %d\12\0"
.align 4
_main:
;; Initialize Stack Pointer
;; r14 = 0
add r14, r0, r0
;; r14 = memSize - 4
lhi r14, ((memSize-4)>>16)&0xffff
addui r14, r14, ((memSize-4) &0xffff)
;; Save the old frame pointer
;; *(r14 - 4) = r30
sw -4(r14), r30
;; Save the return address
;; *(r14 - 8) = r31
sw -8(r14), r31
;; Establish new frame pointer
;; r30 = r14
add r30, r0, r14
;; Adjust Stack Pointer
;; r14 -= 24
add r14, r14, #-24
;; Save Registers
sw 0(r14), r3 ;; *(r14) = r3
sw 4(r14), r4 ;; *(r14+4) = r4
sw 8(r14), r5 ;; *(r14+8) = r5
;; r5 = 0 (set counter to 0)
add r5, r0, r0
;; _a++
;; r3 = &_a
lhi r3, (_a>>16)&0xffff
addui r3, r3, (_a &0xffff)
;; r4 = _a
;; r4 = &_a
lhi r4, (_a>>16)&0xffff
addui r4, r4, (_a &0xffff)
;; r4 = *r4
lw r4, 0(r4)
;; r5++ (_a was loaded into r4 above)
add r5, r5, #1
;; r4++
add r4, r4, #1
;; *(r3) = r4 (i.e., _a = r4)
sw 0(r3), r4
;; r5++ (_a was stored into 0(r3) above)
add r5, r5, #1
;; printf("Value of a is %d\n", _a)
;; r14 -= 8
sub r14, r14, #8
;; r4 = LC0 (address of printf format string)
lhi r4, (LC0>>16)&0xffff
addui r4, r4, (LC0 &0xffff)
;; *(r14) = r4
sw 0(r14),r4
;; r4 = _a
;; r3 = &_a
lhi r3, (_a>>16)&0xffff
addui r3, r3, (_a &0xffff)
;; r4 = *(r3)
lw r4,0(r3)
;; r5++ (yet another load of _a above)
add r5, r5, #1
;; *(r14+4) = r4
sw 4(r14),r4
;; printf()
jal _printf
;; r14 += 8
add r14, r14, #8
;; printf("Counter: %d\n", r5)
;; r14 -= 8
sub r14, r14, #8
;; r4 = LC1 (address of printf format string)
lhi r4, (LC1>>16)&0xffff
addui r4, r4, (LC1 &0xffff)
;; *(r14) = r4
sw 0(r14),r4
;; *(r14+4) = r5
sw 4(r14),r5
;; printf()
jal _printf
;; r14 += 8
add r14, r14, #8
L1:
;; Restore the saved registers
lw r3, -24(r30)
lw r4, -20(r30)
lw r5, -16(r30)
;; Restore return address
lw r31, -8(r30)
;; Restore stack pointer
add r14, r0, r30
;; Restore frame pointer
lw r30, -4(r30)
;; HALT
jal _exit
_exit:
trap #0
jr r31
_open:
trap #1
jr r31
_close:
trap #2
jr r31
_read:
trap #3
jr r31
_write:
trap #4
jr r31
_printf:
trap #5
jr r31