加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

体系结构实验-DLX指令集-冒泡排序-伪汇编

(2017-05-04 10:58:18)
标签:

it

分类: 小代码--
小代码--体系结构实验--DLX指令集--伪汇编

此程序以冒泡排序为例讲解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寄存器中的数放入地址为PrintfValue0x1060)的存储器中

            sw                    PrintfValue(r3),r1     

            addi                  r3,r3,4                             ;地址后移4位

            subi                  r2,r2,1                                ;r2计数,一旦减少到0则

                               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小于f11fps1,否则fps0

            bfpt               HuHuan                     ;如果fps1,则跳转向HuHuan标识符的地址指令

back:                     ;将寄存器中的数写回到存储区中,保存交换后的值

            sf                    PrintfValue(r3),f11     ;将寄存器f11中的数存放到以r3中数为地址的存储区中

            subi                  r3,r3,4

            sf                    PrintfValue(r3),f10

            addi                  r3,r3,4

            subi                  r7,r7,1

                               InnerLop

HuHuan:            

            movi2fp              f1,r0

            addf                 f2,f10,f1

            addf                 f10,f1,f11

            addf                 f11,f1,f2

                              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

                                 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),相等则fpsr5都为1

              bnez        r5,Finish              ; 若 r51,跳转向finish,否则不进行跳转

              subi        r3,r3,48                ;减去48assic码转换为十进制数

              multu      r1,r1,r4               ;r1 乘10

              add         r1,r1,r3               ;r1 加 r3

              addi        r2,r2,1                 ;r2++     ;r2为地址

                         Loop                    ;直到r2存的数是回车,则结束,否则把字符串转化成10进制整数

Finish:   

              lw           r2,SaveR2              ;恢复现场,将存储区中数放入寄存器中

              lw           r3,SaveR3

              lw           r4,SaveR4

              lw           r5,SaveR5

              jr            r31                ;跳转向寄存器r31所存数的地址

3运行结果说明

运行程序,排序13542这五个数字,查看实验结果如图3.1所示。


http://s12/mw690/006pq8sozy7aNZAupmzcb&690

3.1  排序结果

 

从图中可以看到,排序结果正确。程序中出现数据相关、结构相关和控制相关三种相关,三中相关的统计结果如图3.2所示。

http://s7/mw690/006pq8sozy7aNZAzbAWe6&690


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有