COP实现无符号数的排序分析文档格式.docx

上传人:b****5 文档编号:20558104 上传时间:2023-01-24 格式:DOCX 页数:13 大小:420.24KB
下载 相关 举报
COP实现无符号数的排序分析文档格式.docx_第1页
第1页 / 共13页
COP实现无符号数的排序分析文档格式.docx_第2页
第2页 / 共13页
COP实现无符号数的排序分析文档格式.docx_第3页
第3页 / 共13页
COP实现无符号数的排序分析文档格式.docx_第4页
第4页 / 共13页
COP实现无符号数的排序分析文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

COP实现无符号数的排序分析文档格式.docx

《COP实现无符号数的排序分析文档格式.docx》由会员分享,可在线阅读,更多相关《COP实现无符号数的排序分析文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

COP实现无符号数的排序分析文档格式.docx

第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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1