如果我想将用户输入存储在 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 值使用与前两个参数相同的 a0
和 a1
。因此,RISC V 有一个更有用的寄存器集。
除了一些伪指令外,您可以在 RISC V 中执行与在 MIPS 中相同的操作。加载伪指令可以工作,使用加载目标作为中间寄存器来连接两条指令,但一些汇编器也不会接受它。但是没有可用的临时寄存器供汇编器用于存储伪指令扩展,因此不支持。
因此,你必须避免sw
伪指令。您可以改用直接指针,它也更有效,因为(在我的示例中,在循环内)这些只是直接指令而不是多指令序列。然后,您可以将 la
与 sw
分开,例如将其移到循环之外。
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)
...
当然,这里的观察是,如果您有另一个寄存器可用于更长时间的使用,您可以将数组的地址保留在该寄存器中一段时间,以便您可以根据需要重新使用它。
如果我想将用户输入存储在 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 值使用与前两个参数相同的 a0
和 a1
。因此,RISC V 有一个更有用的寄存器集。
除了一些伪指令外,您可以在 RISC V 中执行与在 MIPS 中相同的操作。加载伪指令可以工作,使用加载目标作为中间寄存器来连接两条指令,但一些汇编器也不会接受它。但是没有可用的临时寄存器供汇编器用于存储伪指令扩展,因此不支持。
因此,你必须避免sw
伪指令。您可以改用直接指针,它也更有效,因为(在我的示例中,在循环内)这些只是直接指令而不是多指令序列。然后,您可以将 la
与 sw
分开,例如将其移到循环之外。
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)
...
当然,这里的观察是,如果您有另一个寄存器可用于更长时间的使用,您可以将数组的地址保留在该寄存器中一段时间,以便您可以根据需要重新使用它。