如何在汇编 risc v 中使用 short int 对堆栈的元素求和

Posted

技术标签:

【中文标题】如何在汇编 risc v 中使用 short int 对堆栈的元素求和【英文标题】:How sum the elements of an stack using short int in asembly riscv 【发布时间】:2021-09-13 03:04:54 【问题描述】:

已经有一个使用数组的代码,但我想使用短整数。 如何使用短整数?

sum:
    lw x1, 0x0(x10)
    lw x2, 0x4(x10)
    add x3, x0, x0
loop:
    lw x4, 0x0(x1)
    add x3, x3, x4
    addi x1, x1, 4
    addi x2, x2, -1
    bnex x2, loop
    
    sw x3, 0x8(x10)

【问题讨论】:

你看懂这段代码了吗? 【参考方案1】:

Risc-V 没有任何类型。因此编译器可以使用短整数编译相同的代码到您的示例。

但由于大多数情况下短整数是 16 位长,也称为半字,因此您可以使用 lh(加载半字)和 sh(存储半字)而不是 lw 和 sw 来重写代码。

您还需要注意您正在使用的寄存器,否则代码将无法正确运行。还有你正在加载的内容。在您的示例中,您使用 x10 (a0 - 参数寄存器 1) 作为指向数组指针的指针以及指向大小的指针。这通常不会完成,也无法在 C 中描述(可能使用结构)。

回到寄存器。您正在使用 x1(ra - 返回地址)、x2(sp - 堆栈指针)、x3(gp - 全局指针)和 x4(tp - 线程指针)。所有这些都是您不想为基本通用操作而触摸的寄存器。通常用于此类操作的寄存器是 x5-x7 和 x28-x31 临时寄存器。但为了便于阅读,最好使用 t0-t6 代替。

这是短整数的正确版本:

sum:                 # C-style: short int sum(short int* array, short int size)
                     # a0 holds the array pointer and a1 holds the size
    addi t0, zero, 0 # t0 will hold the result of the summation
loop:
    lh t1, 0(a0)     # load the first element of the array
    add t0, t0, t1   # sum the array element to t0
    addi a1, a1, -1  # decrement the size to not overflow the array
    addi a0, a0, 2   # increment the array address to point to the next array element
                     # its 2 because of short ints (16 bits -> 2 bytes)
    bnez a1, loop    # check if the summation is done

    add a0, t0, zero # move the result to a0 (also return value register)
    ret              # return using the ra register (so don't overwrite the ra register)

我希望这会有所帮助。

如需进一步帮助,我强烈建议您阅读“Risc-V 用户规范”。它还描述了寄存器的使用以及如何很好地映射函数。

【讨论】:

以上是关于如何在汇编 risc v 中使用 short int 对堆栈的元素求和的主要内容,如果未能解决你的问题,请参考以下文章

如何将 M 文件转换为 RISC-V 汇编代码?

RISC-V 启动汇编异常定位

RISC-V 启动汇编异常定位

RISC-V 启动汇编异常定位

RISC-V这次真的要上天了

从RISC到RISC-V