如果我想将用户输入存储在 Risc-v 的数组中,我该如何存储值并进行比较

If I want to store the user input in an array in Risc-v,how do I store the values and compare it

如果我想将用户输入存储在 risc-v 的数组中,我该如何存储值并进行比较

例如在 mips 中我可以这样做:

addi $t1,$v0,0
sw $t1,array($t0)
addi $t0,$t0,4

然后比较一下:

lw $t2,array($t3)
beqz $t2,label # if t2 = 0 then go to label
addi $t3,$t3,4 

您在 MIPS 上使用的 sw 是一条伪指令。伪指令在实际的MIPS机器代码中扩展为二三条指令:这些指令通过一个寄存器互连,即$at——汇编器临时寄存器。

您使用的确切形式是 3 条指令;它扩展到

    lui $at, %hi(array)
    addu $at, $at, $t0
    sw $t1, %lo(array)($at)

RISC V 清理了 MIPS 的大量寄存器使用,包括删除了为汇编程序保留的临时寄存器。他们还将参数寄存器的数量从 MIPS 的 4 个增加到 8 个,同时删除了为操作系统保留的寄存器 $k0 & $k1。此外,它们对 return 值使用与前两个参数相同的 a0a1。因此,RISC V 有一个更有用的寄存器集。

除了一些伪指令外,您可以在 RISC V 中执行与在 MIPS 中相同的操作。加载伪指令可以工作,使用加载目标作为中间寄存器来连接两条指令,但一些汇编器也不会接受它。但是没有可用的临时寄存器供汇编器用于存储伪指令扩展,因此不支持。

因此,你必须避免sw伪指令。您可以改用直接指针,它也更有效,因为(在我的示例中,在循环内)这些只是直接指令而不是多指令序列。然后,您可以将 lasw 分开,例如将其移到循环之外。

    la t0, array
    ...
loop:
    sw t1, 0(t0)       # or sw t1, (t0)
    addi t0, t0, 4
    ...
    beqz t2, loop

此外,不要在某些 RISC V 汇编器中的寄存器名称上使用 $


如果您想使用 MIPS 伪指令,sw 具有全局数组和寄存器偏移量:

sw $t1, array($t0)    # expands to three instructions, also sets & uses `$at`
addi $t0, $t0, 4
...

您可以用以下内容代替:

la $t7, array                  # pick a free temp register
add $t7, $t7, $t0
sw $t1, 0($t7)
...

当然,这里的观察是,如果您有另一个寄存器可用于更长时间的使用,您可以将数组的地址保留在该寄存器中一段时间​​,以便您可以根据需要重新使用它。