繁体   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