[英]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 機器碼中擴展為 2-3 條指令:這些指令通過一個寄存器互連,即$at
at——匯編程序臨時寄存器。
您使用的確切形式是 3 個指令; 它擴展到
lui $at, %hi(array)
addu $at, $at, $t0
sw $t1, %lo(array)($at)
RISC V 清理了很多 MIPS 的寄存器使用,包括刪除了為匯編程序保留的臨時寄存器。 他們還將參數寄存器的數量從 MIPS 的 4 增加到 8,同時刪除了為操作系統保留的寄存器$k0
和$k1
。 此外,它們使用與前兩個參數相同的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)
...
當然,這里的觀察是,如果您有另一個寄存器可用於更長時間的使用,您可能會將數組的地址保留在該寄存器中一段時間,以便您可以根據需要重用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.