簡體   English   中英

如果我想將用戶輸入存儲在 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 機器碼中擴展為 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 此外,它們使用與前兩個參數相同的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)
...

當然,這里的觀察是,如果您有另一個寄存器可用於更長時間的使用,您可能會將數組的地址保留在該寄存器中一段時間​​,以便您可以根據需要重用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM