RISC-V-asm-programming/print_array.s
2024-03-04 11:01:39 +07:00

59 lines
1.0 KiB
ArmAsm

.data
A: .word 11, 22, 33, 44, 55
space: .asciiz " "
newline: .asciiz "\n"
.text
main:
# passing the two arguments to a0 and a1
la a0, A
addi a1, x0, 5
# jump to the print_array procedure
jal print_array
# exit gracefully
addi a0, x0, 10
addi a1, x0, 0
ecall # Terminate ecall
print_array:
addi sp, sp, -12
sw ra, 8(sp) # save ra register on to the stack
sw s1, 4(sp)
sw s0, 0(sp)
addi t0, x0, 0 # i = 0
# move parameters in a0 and a1 to callee-saved registers
mv s0, a0
mv s1, a1
loop:
bge t0, s1, loop_exit # exit loop if i >= size
slli t1, t0, 2 # i = i * 4
add t1, s0, t1 # t1 = &A[0] + i*4
lw t1, 0(t1) # t1 = A[i]
# printf("%d ", A[i])
addi a0, x0, 1
mv a1, t1
ecall
addi a0, x0, 4
la a1, space
ecall
addi t0, t0, 1 # i++
j loop # goto loop
loop_exit:
addi a0, x0, 4
la a1, newline
ecall
# restore ra and return
lw ra, 8(sp)
lw s1, 4(sp)
lw s0, 0(sp)
addi sp, sp, 12
jr ra