目录
零、特别鸣谢
该实验的竣工与深圳大学19级曹老板关系颇深,在此特别感谢曹老板的倾情指导!
一、前言
能进到这篇博文的同学想必手头也拿到了作业的资料,这里废话我就不再赘述了,该实验主要是编写一个排序算法,下面直入主题。
二、Hello World!
1、代码
.data
CONTROL: .word32 0x10000
DATA: .word32 0x10008
STR: .asciiz "Hello World!\n" # the string to print
.text
main1:
ld r10,CONTROL(r0)
ld r11,DATA(r0)
# 输出“STR:Hello world!”
daddi r19,r0,STR
daddi r18,r0,4
sw r19,0(r11)
sw r18,0(r10)
halt
2、运行结果
三、编写排序算法
1、代码
.data
array: .word 9,8,7,6,5,4,10,23,12,100
STR1: .asciiz "before sort the array is: \n"
STR2: .asciiz "after sort the array is: \n"
CONTROL: .word32 0x10000
DATA: .word32 0x10008
.space 64
sp: .word32 0
.text
main:
ld r1,CONTROL($zero) # 获取0x10000和0x10008
ld r2,DATA($zero)
daddi r0,$zero,0
daddi r3,r0,STR1 # 输出str1
daddi r4,r0,4
sd r3,0(r2)
sd r4,0(r1)
daddi r3,$zero,0
print1:
ld r4,array(r3)
sd r4,0(r2) # 数组首位的值存入地址 0
daddi r5,$zero,2
sd r5,0(r1)
daddi r3,r3,8
daddi r4,r3,-80 # 输出10个数,每个是8个字节,所以是要减80
beqz r4,print_end1
j print1
print_end1:
daddi r0,$zero,0
daddi r3,r0,STR2 # 输出str2
daddi r4,r0,4
sd r3,0(r2)
sd r4,0(r1)
daddi $sp,$zero,sp # stack pointer
daddi r5,$zero,array # r5: save the address of array
daddi r6,$zero,10 # r6: save the length of array
jal sort
swap:
dsll r6,r6,3 # r6*8
dadd r11,r6,r5 # r11为当前数组地址
ld r12,0(r11)
ld r13,8(r11)
sd r12,8(r11)
sd r13,0(r11)
jr $ra
sort:
daddi $sp,$sp,-64
sd $ra,0($sp)
sd r7,8($sp)
sd r8,16($sp)
sd r9,24($sp)
sd r10,32($sp)
sd r11,40($sp)
sd r12,48($sp)
sd r13,56($sp)
dadd r8,r6,$zero # length(这里发现$zero相当于一个寄存器)
daddi r9,$zero,1 # i=1
j mid1
loop1:
daddi r10,$zero,0 # j=0
j mid2
loop2:
dsll r7,r10,3 # r10*8,即j*8
dadd r7,r7,r5 # r7为当前数组指针指向的地址
ld r11,0(r7)
ld r12,8(r7)
slt r13,r12,r11 # 如果r12<r11,则r13=1
beq r13,$zero,NotSwap
dadd r6,$zero,r10 #r6=j
jal swap
NotSwap:
daddi r10,r10,1 #j++
mid2:
dadd r3,r9,r10 # i+j
bne r3,r8,loop2 # i+j!=length,即j<len-i
daddi r9,r9,1 # i++
mid1:
bne r8,r9,loop1 # i!=len, 即i<len时
sort_end:
ld $ra,0($sp)
ld r7,8($sp)
ld r8,16($sp)
ld r9,24($sp)
ld r10,32($sp)
ld r11,40($sp)
ld r12,48($sp)
ld r13,56($sp)
daddi $sp,$sp,64
daddi r3,$zero,0
print2:
ld r4,array(r3)
sd r4,0(r2) # 数组首位的值存入地址 0
daddi r5,$zero,2
sd r5,0(r1)
daddi r3,r3,8
daddi r4,r3,-80 # 输出10个数,每个是8个字节,所以是要减80
beqz r4,ishalt
j print2
ishalt:
halt
# jal Index: 跳转到子程序的地址并且把当前位置所在的下一条
# 指令位置存入 ra 寄存器中,以用于子程序执行完后的返回
对应C语言冒泡排序:
2、运行结果
以上
祝好