RISC-V asm 中的简单加法器数组 int 值

问题描述 投票:0回答:1

只需使用堆栈指针 + 偏移量对 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
assembly riscv
1个回答
0
投票

不需要调用下一条指令:

    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
作为第一行。

© www.soinside.com 2019 - 2024. All rights reserved.