只需使用堆栈指针 + 偏移量对 int 数组中的值逐个求和来存储值,以使寄存器空闲。我非常乐意获得有关改进代码的建议。
正在研究RISC-V平台。
array:
.word 1,4,5,3,2
size:
.word 5
.text
.global _start
_start:
addi sp, sp, -20
la t1, array
sw t1, 0(sp) # array
la t0, size
lw t0, 0(t0)
addi t0, t0, -1
sw t0, 4(sp) # loop size
li t0, 0
sw t0, 8(sp) # loop counter
lw t1, 0(t1)
sw t1, 12(sp) # first value of loop result
call _comp
_comp:
lw t0, 8(sp)
lw t1, 4(sp)
bne t0, t1, _sum_array
li a0, 0 # 0 status
li a7, 93 # exit
ecall
_sum_array:
lw t0, 0(sp)
addi t0, t0, 4
sw t0, 0(sp)
lw t1, 0(t0)
lw t2, 12(sp)
add t2, t2, t1
sw t2, 12(sp)
lw t0, 8(sp)
addi t0, t0, 1
sw t0, 8(sp)
call _comp
不需要调用下一条指令:
lw t1, 0(t1)
sw t1, 12(sp) # first value of loop result
call _comp
_comp:
lw t0, 8(sp)
lw t1, 4(sp)
只需消除调用并让处理器自然地从
sw
流向lw
即可。
lw t0, 8(sp)
addi t0, t0, 1
sw t0, 8(sp)
call _comp
这里应该使用
j
指令而不是 call
指令 - 请注意,这些都是伪指令,但前者不捕获返回地址,而后者则捕获 - 两者都是 jal
指令的版本。
应以
.data
指令开始数据部分 - 因为您首先放置数据,然后也将 .data
作为第一行。