![](/img/trans.png)
[英]Code using RISC-V a program that finds the smallest value in the sequence and swaps it with the first value
[英]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
指令的操作數x5
和x7
也必須交換,因為當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, end
和beq 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.