COP实现无符号数的排序分析文档格式.docx
《COP实现无符号数的排序分析文档格式.docx》由会员分享,可在线阅读,更多相关《COP实现无符号数的排序分析文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
第1章实验目的
1.1设计原理
本次课程设计的任务是利用COP200指0令集进行编程,实现对给定内存中的12个8bit无符号数,完成从小到大的排序。
在机器字长为16位时,无符号数表示的范围是0到65535(补码表示),没有正负号之分。
故可以利用冒泡排序法对内存中的12个无符号数进行排序;
冒泡的原理是重复的走访要排序的无符号数,将十个数逐一比较,选出最大的沉底,然后在剩下的数中依次重复上一步骤。
走访无符号数的工作时重复的进行直到排序结束。
1.2设计思路本次课程设计是对无符号数排序。
可以分解成三部分,分别是初始化,将无符号数进行冒泡排序,对排序进行判断并输出。
1.3设计环境
1.COP2000实验环境介绍
利用COP2000模拟软件,在COP2000模拟软件上编程实现有符号数(补码形式)的排序。
COP2000试验仪软件的指令集分为如下大类:
算术运算指令、逻辑运算指令、移位指令、数据传输指令、跳转指令、中断返回指令、输入输出指令。
2.本程序用到的指令集为:
(1)算术逻辑运算指令
SUBA,#01H从累加器中减去立即数后放入累加器A中
ANDA,#01H加上立即数1放入累加器A中
SUBA,@R2累加器A中的数减去R2所指的数
SUBA,R0累加器A中的数减去R0中的数,放入A中
SUBA,R1累加器A中的数减去R1中的数,放入A中
2)数据传送指令
MOVA,#70H;
MOVR1,A内存中十个数的起始地址放入R1中
MOVA,#00H;
MOVR0,A当前已对比的数的个数放入R0中
MOVA,R1;
MOVR2,A将R1存放的地址放入R2中
MOVA,@R1;
R1所指地址中的数放入A中
MOVR3,A;
MOVA,@R2;
MOV@R1,A;
MOVA,R3;
MOV@R2,A;
将R1所指的数与R2所指的数交换
3)跳转指令
JZresult若零标志位为1,跳转到result程序
JCrevise若进位标志置1,跳转到revise
JMPloop跳转到loop
3.
COP2000计算机组成原理实验软件截图如图1.1所示:
图1.1COP2000计算机组成原理软件
第2章详细设计方案
2.1算法与程序的设计与实现
本次课程设计采用伟福COP2000实验仪软件和计算机实现无符号数排序的功能,利用伟福COP2000的指令集编程实现。
算法具体描述如下:
1.将十二个8bit无符号数存储到内存中:
将12个无符号数存入到内存中,数据存入到内存地址70H,71H,72H,73H,74H,75H,,76H,77H,78H,79H,7AH,7BH中。
2.利用冒泡排序法将十二个无符号数排序:
冒泡排序的算法如下:
(1)比较相邻的元素。
如果第一个比第二个大,则交换。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3.判断结束并输出结果:
每对比一对数,R1所指的地址加1,减去7CH,零标志位为1,而7CH表示存的最后一个数地址的下一地址,则表示十二个无符号数比较结束,输出比较之后的按从小到大排序的十二个无符号数。
运算结束。
2.2流程图的设计与实现
1.将十二个8bit无符号数存储到内存中。
如图2.2.1所示
图2.2.1存数流程图
2.初始化冒泡排序循环次数。
如图2.2.2所示。
开始
循环需要对比的数的个数
结束
图2.2.2设置循环次数流程图
3.将十二个无符号数冒泡排序。
如下图所示:
4.
cycle
起始地址放入R1中,R0=0,80H=9
80H-1!
=0
loop
R1存的地址加1放入R2
JC(R1)(-R2)
result
R1所指地址加1
R0+1
(R1)+1)-7AH=0
N80H-R0=0
第3章程序调试与结果测试
3.1程序调试
问题1:
将12个无符号数存储到00地址的内存中,运行出错解决方法:
由于程序指令会占用一部分内存空间,所以将12个8bit无符号数存
储到70H地址的内存中;
这里也可以选中其它的存储位置,只要不使用到程序指令占用的位置。
问题2:
程序执行完,输出的结果不全是按从小到大排列。
解决方法:
在输出结果前,没有判断是否已经完成比较。
每比较一次,R1所指地址加1,直到R1所指地址加1后的地址减去7CH等于0,而7CH表示所存无符号数的最后一个数地址的下一地址。
运算结束并输出结果。
4.2程序测试及结果分析
在COP2000中输入立即数,将需要排序的12个8bit无符号数放入内存70H到7BH中调试,进行排序测试;
测试数据:
(1)需排序的无符号数:
02,04,06,01,03,05,08,09,00,07,12,11排序后的无符号数:
00,01,02,03,04,05,06,07,08,09,11,12内存中初始状态如图3.2.1所示。
执行完成后内存中结果如图3.2.2所示。
软件仿真结果如图3.2.3所示。
图3.2.1内存中初始状态
图3.2.2执行完成后内存中状态
图3.2.3软件仿真结果图
(2)需排序的无符号数:
21,20,15,31,08,06,08,10,11,09,18,15
排序后的无符号数:
06,08,08,09,10,11,15,15,18,20,21,31
内存中初始状态如图3.2.4所示。
执行完成后内存中结果如图3.2.5所示
软件仿真结果如图3.2.6所示。
图3.2.4内存中初始状态
图3.2.5内存中初始状态
图3.2.6软件仿真结果图
(3)需排序的无符号数:
29,0A,0B,A1,2B,3C,A1,A2,01,05,C1,0F排序后的无符号数:
01,05,0A,0B,0F,29,2B,3C,A1,A1,B2,C1内存中初始状态如图3.2.7示。
执行完成后内存中结果如图3.2.8示软件仿真结果如图3.2.9示。
图3.2.7内存中初始状态
图3.2.8执行完成后内存中状态
图3.2.9软件仿真结果图
第4章实验扩展
4.1原来的实验
原来的实验是借鉴了网上的实验,数据只能通过在70H到7BH中手动写入。
感觉很不方便。
我想到了学过的IN指令输入数据,并进行排序。
由于在自己的电脑上无法进行模拟。
所以这里我采用了数据输入的方法。
4.2改进后的实验
改进后的代码见examnew.sam。
改进的过程中又遇到了上面的问题1。
由于程序指令会占用一部分内存空间,所以将12个8bit无符号数存储到80H地址的内存中;
这里也可以选中其它的存储位置,只要不使用到程序指令占用的位置。
这个代码中是采取自动输入0C到01这12个数。
代码为
start:
MOVA,#0CH;
MOV91H,A;
MOVA,#80H;
MOVR3,A;
MOVA,#0CH;
MOVR2,A;
这里是设置一个为13的值放在91H这个地址。
将R3的值设为80H,用来指向地址的。
最后的R2是因为无法使用IN指令,我设置的一个输入的值,为0Cinput:
MOVA,R2把R2写入A,用来代替IN
MOV@R3,AMOVA,R3ADDA,#01HMOVR3,A
将R2的值放入80H,并将地址加1
MOVA,R2SUBA,#01HMOVR2,A将R2的值减1,用于下次写入
MOVA,R0;
ADDA,#01H;
MOVR0,A;
MOVA,91H;
SUBA,R0;
JZover;
用来判断循环了几次。
每一次循环加1,一共循环12次。
JMPinput;
需排序的无符号数:
0C,0B,0A,09,08,07,06,05,04,03,02,01
01,02,03,04,05,06,07,08,09,0A,0B,0C
修改的程序测试结果如下自动生成内存中初始状态如图4.2.1示。
执行完成后内存中结果如图4.2.2示
图4.2.1自动生成内存中初始状态
图4.2.2执行完成后内存中状态
第5章结论心得
本次课程设计我做的是使用cop2000模拟软件,实现对12个无符号的数进行排序。
排序采用的是比较经典的冒泡排序,通过对每两个相邻的数进行比较。
如果第一个大于第二个,就将第一个和第二个进行换位置。
换位采用的MOVA,@R1;
MOVA,@R2;
MOV@R1,A;
MOVA,R3;
MOV@R2,A;
以上几句代码就是将R1所指的数与R2所指的数交换。
过程是首先将R1地址所指的数放到寄存器A中,然后将A的值放在R3中,再接着将R2地址所指的数放入A,再将A的值放入R1对应的地址位置,此时R1地址的值是R2地址对应的值。
将刚刚存在R3中值打回寄存器A中,将A的值放入R2对应的地址中。
到此完成R1和R2对应地址的值的交换。
在编写这个程序的时候通过网上查询,我找到了思路。
网上是实现的10个数的排序,在编写的时候我是实现了12个数的排序。
实现了12个数的排序我还是不满足。
我就在想着能不能实现自己手动输入数值进行排序,我想到了IN指令。
通过查阅资料,我知道了IN指令是将数打入寄存器A中,我就想将A的数放入#70H中。
但是在cop2000我没找到模拟的方法。
这里我采用了给入一个数放在R2中每次将1,用来代替IN输入。
然后通过跳转,12次循环。
这里我又设置了控制循环的指令。
一共实现了12次循环。
这个循环变量放在91H中。
在实现这个功能的时候又不得不把存储的值由70H移动到80H中。
由于之前的组成原理的实验,学习过cop2000。
总的来书实验的难度不是很大。
这个实验加深了对汇编的理解。
有一次复习了cop2000的基本操作。
课程设让我进一步理解了冒泡排序法,并在cop2000中运用成功。
虽然这次课程设计我没有自己设计指令系统。
但是我也复习了一下指令系统设计这一部分。
加深了对指令系统的理解。
附录(源代码)
MOV91H,A;
MOVA,#80H;
input:
MOVA,R2
MOV@R3,A
MOVA,R3
ADDA,#01H
MOVR3,A
SUBA,#01H
MOVR2,A
ADDA,#01H;
MOVR0,A;
MOVA,91H;
SUBA,R0;
JZover;
over:
MOV90H,A;
cycle:
MOVR1,A;
MOVA,#00H;
MOVA,90H;
SUBA,#01H;
JZresult;
LOOP:
SUBA,@R2;
JCrevise;
JZcycle;
JMPLOOP;
revise:
MOVA,90H;
result:
print:
MOVA,@R1
OUT
MOVA,80H
MOVR0,A
MOVA,81H
MOVR1,A
MOVA,82H
MOVA,83H
MOVA,R1
MOVA,#80H
SUBA,R1
JZNcycle
JMPprint
Ncycle:
ABC:
JMPABC