编程练习:
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