用RISC v写程序

编程练习:
1、顺序结构的编程: 计算y=10a+6b-c,其中y放在寄存器a0中,a、b、c三个变量存放的寄存器不限。要求不用乘法指令。

2、分支结构的编程: 计算C语言表达式: if(x>y) z=x+5; else z=y-5。其中z存放在寄存器a1中,x、y存放的寄存器不限。
3、循环结构的编程: 计算y=1+2+3...+100,y存放在寄存器a2中
4、(选做)利用数据结构课所学的任意一种排序方式,将数据区的10个数字按从小到大排序,并输出显示。要求程序的第一行注释里写明是采用什么排序方式。数据区为:
.data
array: .word -15,1024,12,60,17,26,-18,19,100,86

1. 顺序结构:

.data

y: .word 0

a: .word 5 #初始化

b: .word 3

c: .word 9

amsg: .asciz "请输入a:"

bmsg: .asciz "请输入b:"

cmsg: .asciz "请输入c:"

ymsg: .asciz "y的值为:"

.text

main:

#输入a

la a0, amsg

li a7 4

ecall

li a7 5

ecall

mv s0, a0 #a存在s0中

#输入b

la a0, bmsg

li a7 4

ecall

li a7 5

ecall

mv s1, a0 #b存在s1中

#输入c

la a0, cmsg

li a7 4

ecall

li a7 5

ecall

mv s2, a0 #c存在s2中

lw a0, y #y存在a0中

mv t0, s0 #复制a、b的值

mv t1, s1

slli s0, s0, 3 #a左移三位即a*8

add s0, s0, t0

add s0, s0, t0 #再加两次a就可以得到10a

slli s1, s1, 2 #4*b

add s1, s1, t1

add s1, s1, t1 #6b

add a0, s0, s1 #10a+6b

sub a0, a0, s2 #10a+6b-c

exit:

mv t2, a0 #暂存y

#输出y,即a0

la a0, ymsg

li a7 4

ecall

mv a0, t2

li a7, 1

ecall

addi a7, zero, 10    #系统调用,功能号为10。功能: 结束退出,即exit

ecall

 

2. 分支结构:

.data

z: .word 0

x: .word 0

y: .word 0

xmsg: .string "请输入x:"

ymsg: .string "请输入y:"

zmsg: .string "z的值为:"

.text

main:

lw a1, z #a1=z

la a0, xmsg #打印输入x的文本

li a7, 4

ecall

li a7, 5 #输入x

ecall

mv s0, a0 #s0存x

la a0, ymsg #打印输入的文本

li a7, 4

ecall

li a7, 5 #输入y

ecall

mv s1, a0 #s1存y

blt s1, s0, branch1 #y<x,则跳转到分支1

bge s1, s0, branch2 #y>=x,则跳转到分支2

branch1:

add a1, s0, s1 #计算z=x+y

j exit

branch2:

addi t0, zero, 5

sub a1, s1, t0 #计算y-5

exit:

la a0, zmsg #打印z的值

li a7, 4

ecall

mv a0, a1

li a7, 1

ecall

li a7, 10 #退出

ecall

3. 循环结构:

.data

y: .word 0

ymsg: .asciz "y的值为:"

.text

main:

lw a2, y #y存在寄存器a2中

li t1, 1 #t1=1

li t2, 100 #临界t2=100

loop:

add a2, a2, t1 #y+t1

addi t1, t1, 1 #t1++

ble t1, t2, loop #t1>100则结束循环

exit:

la a0, ymsg #打印y值

li a7, 4

ecall

mv a0, a2

li a7, 1

ecall

li a7, 10

ecall

 

4. 冒泡排序:

#```````````冒泡排序````````````

.data

array: .word -15, 1024, 12, 60, 17, 26, -18, 19, 100, 86

msg: .string "排序后的数组为:\n"

blank: .ascii " " #空格

.text

main:

la t0, array #存array的首地址

addi t1, zero, 0 # i=0

addi t2, t1, 11 #数组元素个数10,后面i多加了一次

addi t3, zero, 0 # j=0

addi s1, t2, -1 #s1=9

loop1:

bge t1, t2, print       # i >= n 打印

li t3, 0 #j

addi t1, t1, 1 # i++

loop2:

sub t4, s1, t1 # n-i-1

blt t3, t4, branch # j<= n-i-1

j loop1

branch:

slli a1, t3, 2     #t1左移3位即乘以4,乘4是因为word数据4字节 a1=j*4

add a1, t0, a1        #数组首地址t0加a1,即走到数组的第1个元素 a1=array+j*4

lw a2, 0(a1)     #取数组元素值放入t4 a2=array[j]

lw a3, 4(a1)  #下一个元素 a3=array[j+1]

bgt a2, a3, swap #第j个元素 > 第j+1个元素则交换

addi t3, t3, 1 # j++

j loop2

swap:

sw a3, 0(a1) #array[j]=a3即第j+1个元素

sw a2, 4(a1) #array[j+1]=a2

addi t3, t3, 1 # j++

j loop2

print:

la a0, msg

li a7, 4

ecall

la t0, array

li s2, 10 #总数n=10

li s3, 0 #i=0

printloop:

beq s3, s2, exit #i=10时退出

slli s4, s3, 2 #4*i

add s4, t0, s4 #array+4i

lw a0, 0(s4)

li a7, 1

ecall

la a0, blank #两数之间加空格

li a7, 4

ecall

addi s3, s3, 1 #i++

j printloop

exit:

li a7, 10

ecall

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值