![](/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.