簡體   English   中英

使用 RISC-V 編寫一個給出序列中最大值的程序

[英]Code using RISC-V a program that gives the largest value in a sequence

問題是:

給定一個后跟 0 的非零整數序列,找到該序列中最大的整數並將結果放在x5 使用DD匯編命令將-1、55、-3、7、0的初始測試序列存儲在內存的開頭。

我已經嘗試了多種變體:

src:    DD -1, 5, -3, 7, 0
        add x6, x0, x0
loop:   ld x5, src(x6)
        sd x7, dst(x6)
        beq x5, x0, end
        bge x5, x7, skip
skip:   addi x6, x6, 8
        beq x0, x0, loop
end:    ebreak x0, x0, 0
dst:    DM 1

但是,沒有任何效果,我需要一些關於如何回答這個問題以及 RISC-V 工作原理的幫助。

我認為您對寄存器的預期用途是:

  • x5包含從序列中讀取當前值
  • x6包含序列索引
  • x7包含迄今為止看到最大值

不需要將x7存儲在內存中,因為最大值在任何時候都是單個值。 寄存器x7應該在一開始就被初始化。

x7可以用它可以保持的最低可能值進行初始化,即-2 63

addi x7, x0, 1
slli x7, x7, 63

除了這個可能的最低值之外,從序列中讀取的任何值都將導致更新當前的最大值。

或者,您可以直接將序列的第一個元素加載到x7因為總是有一個元素可供加載(如果它是一個空序列,則終止0 ):

ld x7, sr(x6)

代碼中的以下分支指令:

        bge x5, x7, skip
skip:   addi x6, x6, 8

無論條件是否成立( x5 >= x7 ),執行的下一條指令總是addi x6, x6, 8 在這兩條指令之間,在skip標簽之后,缺少的是用於更新目前看到的當前最大值的代碼,即用於將內容從x5移動到x7的指令。 bge指令的操作數x5x7也必須交換,因為當x7 >= x5成立時,您想跳過更新最大值的代碼(即,當最大值已經大於或等於當前值時不更新最大值):

        bge x7, x5, skip # skip the update of the maximum?
        addi x7, x5, 0   # update new maximum value
skip:   addi x6, x6, 8

因此,如果分支條件成立,即如果x7 (最大值)大於或等於x5 (讀取的當前值),則跳過用於更新最大值的代碼。


而不是在循環中有兩條分支指令:如果在序列中達到零值則終止循環的beq x5, x0, end ,以及作為beq x0, x0, loop的最后一條指令的無條件跳轉beq x0, x0, loop重復循環,您可以重新排列代碼,使循環的最后一條指令是:

bne x5, x0, loop   # is the end of the sequence not reached yet?

這將替換beq x5, x0, endbeq x0, x0, loop :如果已達到序列的終止值(即零),則它會失敗,否則,它會再次迭代循環。


記住所有這些事情,您的代碼可能如下所示:

src:    DD -1, 5, -3, 7, 0

        add x6, x0, x0      # initialize the index
        ld x7, sr(x6)       # initialize the maximum
        addi x5, x7, 0      # initialize with the first value

        beq x5, x0, end     # is the sequence empty?

loop:   bge x7, x5, skip    # skip the update of the maximum?
        addi x7, x5, 0      # update the maximum with the new value read
skip:   addi x6, x6, 8      # update the index
        ld x5, sr(x6)       # load the next value from the sequence
        bne x5, x0, loop    # is the end of the sequence not reached yet?        
end:    
        addi x5, x7, 0      # place the final result in x5 (your problem's assignment)
        ebreak x0, x0, 0

暫無
暫無

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

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