此程序以冒泡排序为例讲解DLX指令的编写。
程序主要包括两部分,一部分为输入函数,一部分为冒泡排序主程序。输入函数主要接收从键盘标准输入的数,主程序对输入的数进行排序。
http://s6/mw690/006pq8sozy7aNZw2jbLb5&690
1冒泡排序主程序
伪指令代码部分
;.data标识下面的数据放在数据区中
.data
;.asciiz表示在存储区中顺序存放列出的字符串,字符串自动加0结束
Prompt:
.asciiz
"input An integer which is array's size value >1 : "
PromptLast:
.asciiz
"input an integer :"
PrintfFormat:
.asciiz
"Number : %g "
;.align
使后面的数据代码按一定规则对齐,表示下一个字开始
.align
2
;.word在存储器中顺序存放列出的字
PrintfPar:
.word
PrintfFormat
;.space
size在存储区中空出size大小的区域
Printf:
.space
8
PrintfValue:
.space
1024
;.text标识下面的代码存放在代码区中
.text
;.global使带有.global的标识可以被全局访问
.global
main
main:
addi
r1,r0,Prompt ;将Prompt字符串首地址"input
integer size放入r1
;跳向InputUnsigned,调用input子函数读取标准输入并存入DLX处理器的通用寄存器R1中
jal
InputUnsigned
add
r2,r0,r1
;将input函数读取的数放入寄存器2678中
add
r6,r0,r1
add
r7,r0,r1
add r8,r0,r1
addi
r3,r0,0
InputArray:
;循环调用input函数读数
beqz
r2, ProcessPart ;
r2寄存器中的值为0则跳转向ProcessPart
addi
r1,r0,PromptLast ;"input
an integer :"
jal
InputUnsigned
;将r1寄存器中的数放入地址为PrintfValue(0x1060)的存储器中
sw
PrintfValue(r3),r1
addi
r3,r3,4
;地址后移4位
subi
r2,r2,1
;r2计数,一旦减少到0则
j
InputArray
;无条件跳转向InputArray标识的指令地址
ProcessPart:
addi
r3,r0,0
;r3寄存器中数清0
OutLoop:
;外层循环
beqz
r6,End
; r6中所存数为0则跳转向End所标识的指令地址
addi
r3,r0,0
;若r6不为0,则
subi
r7,r6,1
;r7=r6-1
add
r6,r0,r7
;
r6=r7
????
InnerLop: ;内层循环
beqz r7,
OutLoop ;r7中数为0则跳转OutLoop地址
lf
f10,PrintfValue(r3)
;r3中的数+立即数PrintfValue存到双精浮点数寄存器F10中
addi r3,r3,4
lf
f11,PrintfValue(r3)
;将以PrintfValue为地址的存储区中的数放入f11寄存器中
lef f10
,f11 ;如果f10小于f11,fps为1,否则fps为0
bfpt HuHuan ;如果fps为1,则跳转向HuHuan标识符的地址指令
back: ;将寄存器中的数写回到存储区中,保存交换后的值
sf
PrintfValue(r3),f11
;将寄存器f11中的数存放到以r3中数为地址的存储区中
subi
r3,r3,4
sf
PrintfValue(r3),f10
addi
r3,r3,4
subi
r7,r7,1
j
InnerLop
HuHuan:
movi2fp
f1,r0
addf
f2,f10,f1
addf
f10,f1,f11
addf
f11,f1,f2
j
back
End:
addi
r3,r0,0
output:
;输出结果
subi r8,r8,1
lf
f2, PrintfValue(r3)
cvti2d
f0,f2 ;单精度转换为双精度
sd
Printf,f0
addi
r14,r0,PrintfPar
trap
5
;标准输出
addi
r3,r3,4
beqz
r8,over
j
output
over:
;程序结束
trap 0
2输入函数
.data
ReadBuffer:
.space
80
ReadPar:
.word
0,ReadBuffer,80
PrintfPar:
.space
4
SaveR2:
.space
4
SaveR3:
.space
4
SaveR4:
.space
4
SaveR5:
.space
4
.text
.global
InputUnsigned
InputUnsigned:
sw
SaveR2,r2 ;保存现场,将寄存器中的数放入存储区中
sw
SaveR3,r3
sw
SaveR4,r4
sw
SaveR5,r5
sw
PrintfPar,r1
addi
r14,r0,PrintfPar ;r14=r0+r1
trap
5 ;标准输出
addi
r14,r0,ReadPar
trap
3 ;标准输入一行;读入的数放入r2,扩展为32位存放在r3,
addi
r2,r0,ReadBuffer
addi
r1,r0,0
;r1清零
addi
r4,r0,10
;十进制
Loop: ;计算标准输入值
lbu
r3,0(r2) ;将以r2为地址的存储区中的数按符号扩展为32位存放在r3寄存器中
seqi
r5,r3,10 ;r3寄存器中的数是否等于回车(10),相等则fps、r5都为1
bnez
r5,Finish ;
若 r5为1,跳转向finish,否则不进行跳转
subi
r3,r3,48 ;减去48将assic码转换为十进制数
multu
r1,r1,r4 ;r1
乘10
add
r1,r1,r3
;r1 加 r3
addi
r2,r2,1 ;r2++
;r2为地址
j
Loop
;直到r2存的数是回车,则结束,否则把字符串转化成10进制整数
Finish:
lw
r2,SaveR2 ;恢复现场,将存储区中数放入寄存器中
lw
r3,SaveR3
lw
r4,SaveR4
lw
r5,SaveR5
jr
r31
;跳转向寄存器r31所存数的地址
3运行结果说明
运行程序,排序1、3、5、4、2这五个数字,查看实验结果如图3.1所示。
http://s12/mw690/006pq8sozy7aNZAupmzcb&690
图3.1
排序结果
从图中可以看到,排序结果正确。程序中出现数据相关、结构相关和控制相关三种相关,三中相关的统计结果如图3.2所示。
http://s7/mw690/006pq8sozy7aNZAzbAWe6&690