Attempt to print register values in regdump

This commit is contained in:
Wesley Moore 2025-02-10 14:00:44 +10:00
parent 951900bce9
commit 947f1fca89
No known key found for this signature in database
2 changed files with 52 additions and 19 deletions

63
calc.s
View file

@ -4,6 +4,8 @@
# Provide program starting address to linker
.global _start
.extern tohex
/* newlib system calls */
.set SYSEXIT, 93
.set SYSWRITE, 64
@ -54,7 +56,7 @@ end:
li a1, 1 # 1
li a2, 0x80000000 # 0.5
li a3, 1 # 1
jal add64
# jal add64
#add t1, a0, 0 # copy a0 to t0 as end with overwrite it
jal regdump
@ -83,11 +85,25 @@ add64:
# Print values of all registers (in hex)
# write syscall uses t0, a0, a1, a2
regdump:
addi sp, sp, -16 # allocate stack space
sw a0, 12(sp) # save contents of a0
sw a1, 8(sp) # save contents of a0
sw a2, 4(sp) # save contents of a0
sw t0, 0(sp) # save contents of a0
# save all registers to preserve their state when entering the function
# except sp, which will be offset by -64
addi sp, sp, -64 # allocate stack space to stash all registers
sw x0, 0(sp)
sw x1, 4(sp)
sw x2, 8(sp)
sw x3, 12(sp)
sw x4, 16(sp)
sw x5, 20(sp)
sw x6, 24(sp)
sw x7, 28(sp)
sw x8, 32(sp)
sw x9, 36(sp)
sw x10, 40(sp)
sw x11, 44(sp)
sw x12, 48(sp)
sw x13, 52(sp)
sw x14, 56(sp)
sw x15, 60(sp)
li t0, SYSWRITE # "write" syscall
li a0, 1 # 1 = standard output (stdout)
@ -107,32 +123,45 @@ regdump_loop:
# copy regname to buf
la a0, buf # load address of buf into a0 as dest
li a2, 2 # copy 2 bytes
addi sp, sp, -4 # allocate stack space
sw ra, 0(sp) # save contents of ra
addi sp, sp, -4 # allocate stack space
sw ra, 0(sp) # save contents of ra
jal memcpy
lw ra, 0(sp) # save contents of ra
addi sp, sp, 4 # deallocate stack space
# append ': \n'
lw ra, 0(sp) # restore contents of ra
addi sp, sp, 4 # deallocate stack space
# append ': '
li t0, ':
sb t0, 0(a0)
li t0, 0x20
sb t0, 1(a0)
li t0, '\n
sb t0, 2(a0)
addi a0, a0, 2 # bump a0 address over ': ' text
mv a1, a0 # load address of output buffer to a1
slli a2, s0, 2 # calculate the offset of the register value relative to sp
add a2, a2, sp # a2 = sp + (s0 * 4)
lw a0, 0(a2) # load register value to format into a0
addi sp, sp, -8 # allocate stack space
sw a1, 4(sp) # save contents of a1
sw ra, 0(sp) # save contents of ra
jal tohex
lw ra, 0(sp) # restore contents of ra
lw a1, 4(sp) # restore contents of a1 (buffer)
addi sp, sp, 8 # deallocate stack space
li t0, '\n # append newline
sb t0, 8(a1)
# print the register name
# print the register name and value
li t0, SYSWRITE # "write" syscall
li a0, 1 # 1 = standard output (stdout)
la a1, buf
li a2, 5 # length of register name string
li a2, 4+8+1 # length of register name string:
# rr: 12345678\n
ecall # invoke syscall to print the string
addi s0, s0, 1
j regdump_loop
regdump_done:
addi sp, sp, 16 # deallocate stack space
# TODO: Restore s0 & s1
addi sp, sp, 64 # deallocate stack space
ret

8
hex.s
View file

@ -16,10 +16,12 @@ hexchars:
# return:
# none
tohex:
addi sp, sp, -20 # allocate stack space
sw s0, 12(sp) # save contents of s0
sw s1, 8(sp) # save contents of s1
li s0, 0 # set up loop variables
li s1, 4
addi a1, a1, 6 # offset output address to end chars
addi sp, sp, -12 # allocate stack space
tohex_loop:
sw ra, 8(sp) # save contents of ra
sw a0, 4(sp) # save contents of ra
@ -33,7 +35,9 @@ tohex_loop:
addi a1, a1, -2 # decrement output buffer address
addi s0, s0, 1 # increment loop counter
blt s0, s1, tohex_loop # TODO: we don't need the loop counter and output addr
addi sp, sp, 12 # deallocate stack space
lw s0, 12(sp) # restore s0 & s1
lw s1, 8(sp)
addi sp, sp, 20 # deallocate stack space
ret
# Convert byte to ASCII hex