RISC-V编程——冒泡排序

RISC-V编程——冒泡排序

刚接触RISCV指令集架构。下面是参考计算机组成与设计riscv版这本书写下的汇编代码。
模拟器为rars 1.5版本。RV32

#冒泡排序
#两个循环达成
#v,n保存在a0和a1中。i,j保存在s3和s4中。s5和s6用于复制保存v,n。
#t0,t1,t2做临时寄存器
.data
v:   
     .word 12,13,6,9,1,4,3,10,8

.text
sort:
      addi sp,sp,-20
      sw   ra,16(sp)
      sw   s7,12(sp)
      sw   s6,8(sp)
      sw   s4,4(sp)
      sw   s3,0(sp)
      li   a1,9        #n=9
      li   s3,0        #i=0
      la   a0,v        #a0=v的address
      mv   s5,a0       #s5=v   
      mv   s6,a1       #s6=n
loop1:
      bge  s3,s6,exit1 #i>=n,goto exit1
      addi s4,s3,-1    #else,j=i-1
loop2:
      blt  s4,x0,exit2 #j<0,goto exit2
      slli t0,s4,2     #t0=j*4,word
      add  t0,s5,t0    #t0=v+j*4
      lw   t1,0(t0)    #t1=v[j]
      lw   t2,4(t0)    #t2=v[j+1]
      ble  t1,t2,exit2 #if v[j]<=v[j+1].goto exit2
      mv   a0,s5       #else,a0=v,用于swap
      mv   a1,s4       #a1=j,用于swap
      jal  ra,swap
      addi s4,s4,-1    #j=j-1
      j    loop2
exit2:
      addi s3,s3,1     #i=i+1
      j    loop1
exit1:
      lw   s3,0(sp)
      lw   s4,4(sp)
      lw   s6,8(sp) 
      lw   s7,12(sp)  
      lw   ra,16(sp) 
      addi sp,sp,20   
      jal  x0,exit
swap:
     slli t0,a1,2
     add  t0,a0,t0   #v+k
     lw   t1,0(t0)  #t1=v[k]
     lw   t2,4(t0)  #t2=v[k+1]
     sw   t2,0(t0)  #v[k]=t2
     sw   t1,4(t0)  #v[k+1]=t0
     jalr  x0,0(ra) #回去
exit:
  • 10
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
好的,能够为您讲解RISC-V汇编的冒泡排序算法。在RISC-V汇编中实现冒泡排序的关键是掌握数据的读取和交换操作。以下是一个简单的RISC-V汇编代码实现冒泡排序: # 冒泡排序 .globl _start .text .align 2 _start: # 初始测试数组 addi t0, zero, 10 li t1, 6 li t2, 4 li t3, 2 li t4, 3 li t5, 5 li t6, 1 li t7, 7 li t8, 8 li t9, 9 sw t1, 0(t0) # 存储数组 sw t2, 4(t0) sw t3, 8(t0) sw t4, 12(t0) sw t5, 16(t0) sw t6, 20(t0) sw t7, 24(t0) sw t8, 28(t0) sw t9, 32(t0) # 冒泡排序算法 addi t1, zero, 0 # i=0 addi t2, zero, 10 # j=10 for1: # 外层循环 addi t2, t2, -4 # j=j-1 beq t2, zero, done # j=0 跳转到done addi t6, zero, 0 # k=0 addi t7, t0, 0 # a=$t0[0] for2: # 内层循环 addi t6, t6, 1 # k=k+1 lw t8, (t0), t6 # t8=a[k] lw t9, (t0), t6-1 # t9=a[k-1] blt t8, t9, swap # 如果t8<t9,跳转到swap add t7, t7, 4 # a=a+4 bne t6, t1, for2 # 如果k不等于i,继续循环 j for1 # 继续外层循环 swap: # 交换数据 lw t8, (t0), t6 lw t9, (t0), t6-1 sw t9, (t0), t6 sw t8, (t0), t6-1 addi t7, zero, 0 # a=$t0[0] bne t6, t1, for2 # 如果k不等于i,继续循环 j for1 done: # 输出排序后的数组 addi t1, zero, 0 # i=0 addi t2, t0, 0 # a=$t0[0] addi t3, zero, 10 # n=10 addi t4, zero, 1 # j=1 for3: lw t5, (t2), 0 # t5=a[i] li a1, 1 li a0, 4 ecall # 输出a[i] addi t4, t4, 1 # j=j+1 beq t4, t3+1, exit # 如果j>n+1,退出循环 addi t1, t1, 1 # i=i+1 addi t2, t2, 4 # a=a+4 bne t1, t3, for3 # 如果i!=n,继续循环 exit: li a1, 10 li a0, 17 ecall # 退出程序 .data 上述代码将数字存储在以t0为基地址的数组中,并使用冒泡排序算法按照升序对数字进行排序。排序结果将以从小到大的顺序输出到控制台。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邶风,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值