BCD码的加法DOC.docx
《BCD码的加法DOC.docx》由会员分享,可在线阅读,更多相关《BCD码的加法DOC.docx(17页珍藏版)》请在冰豆网上搜索。
BCD码的加法DOC
沈阳航空航天大学
课程设计报告
课程设计名称:
计算机组成原理课程设计
课程设计题目:
COP2000实现BCD码的加法
院(系):
计算机学院
专业:
计算机科学与技术
班级:
3401010x
学号:
***********xx
姓名:
张伟
指导教师:
***
完成日期:
2016年1月15日
第1章总体设计方案
1.1设计原理
课程设计要求加数、被加数以及和都采用压缩的BCD码,都是6位十进制数,但是从COP2000上面只能输入两位十六进制数,即8位二进制数。
所以在设计时将6位十进制数分为3组,每组2位,进行相加,找6个存储单元对3组数的低位运算和高位运算进行存储,最后两两求和,将最低两位、中间两位、最高两位结果分别放入r3、r2、r1中。
设计时最核心的四个问题我认为分别是将最低位数据左移四位,将数据与F0相与,设计计数单元与进位位存储单元。
1.2设计思路
COP2000上面每次只能输入两个十六进制数,即8个二进制数,现在欲将6位十进制数输入,只能分成3组,3组分别相加。
在进行加法时,要考虑到进位,但是COP2000只能判别最高位是否有进位,所以在进行加法时,将最低位数据左移4次,放到最高位,便可以顺利解决判断进位问题。
在进行每组数据最高位加法时,要将数据与0F0H相与,使低四位清零。
在进行加法时,由于考虑到进位问题,所以设计f7单元存储进位,进位存储单元初始时置0,每当产生进位时,
MOVA,#10HMOV0F0H,A使进位单元置1,所以每进行加法时,都要将进位单元数据相加。
由于数据是分成三组进行,所以在进行运算时需要进行选择,初始时将计数单元置0,进行最后两位运算时计数单元加1,进行中间两位运算时,置数单元继续加1,最高两位运算在加1,当进行选择时,使计数单元数据减去2,当为最低两位时,1减2发生借位,进而执行JC所指向的地址。
当计数单元数据为2减去2时,结果等于0,进而执行JZ所指向单元,当计数单元数据为3时,减去2,结果为1,不执行JC与JZ的指令,执行JMP所指向的地址。
三组数据的低位高位结果分别放入6个存储空间中,最后R0存储最高位两位数据计算结果,R1存储中间两位数据计算结果,R3存储最低两位数据计算结果。
1.3设计环境
COP2000实验平台对应的模型机为8位机,数据总线和地址总线均为8位。
包括一个标准CPU所具备所有部件,这些部件包括:
运算器ALU、累加器A、工作寄存器W、左移门L、右移门R、直通门D、寄存器组R0~R3、程序计数器PC、地址寄存器MAR、堆栈寄存器ST、中断向量寄存器IA、输入端口IN、输出端口寄存器OUT、程序存储器EM、指令寄存器IR、微程序计数器uPC、微程序存储器。
在COP2000仿真软件上实现编程,所应用的编程语言为汇编语言。
在伟福试验仪中有相关的模型机指令集分为几大类:
算术运算指令、数据传输指令、移位指令、逻辑运算指令、跳转指令、中断返回指令、输入输出指令。
本程序所用到的相应的指令集
(1)算术逻辑运算指令
ADDA,R?
------------将寄存器R?
的值加入累加器A中
ADDA,#II----------立即数#II加入累加器A中
SUBA,#II-----------从累加器中减去立即数后加入累加器A中
ANDA,#II-----------累加器A“与”立即数II
(2)数据传送指令
MOVA,R?
------------将寄存器R?
的值送到累加器A中
MOVA,MM------------将存储器MM的地址的值送到累加器A中
MOVMM,A------------将累加器A的值送到存储器MM的地址中
MOVR?
#II------------将立即数II存放到寄存器R?
中
MOVR?
,A------------将累加器A中的值送到寄存器A中
(3)移位指令
RRA----------------累加器A右移
RLA----------------累加器A左移
(4)跳转指令
JZMM---------------若零标志位置1,跳转到MM地址
JMPMM---------------跳转到MM
JCMM---------------若借位标志置1,跳转到MM地址
(5)位运算
ANDA,R?
------------累加器A“与”寄存器R?
的值
如下为COP2000实验软件截图:
图1.3.1COP2000计算机组成原理集成调试软件
第2章详细设计方案
2.1算法与程序的设计与实现
本课设采用伟福COP2000实验仪软件和计算机实现6位十进制BCD码相加功能,利用伟福COP2000的指令集编程实现。
(a)存数:
将两个数据分为三组共6部分存储到内存单元中。
存入的内存单元分别是0f0h、0f1h、0f2h、0f3h、0f4h、0f5h。
(b)设计进位位单元与计数单元。
并且分别置0,存储到0f6h与0f7h中。
(c)这一部分为程序的核心部分。
首先将内存单元0f2h与0f5h数据取出来放到内存R0与R1中,然后将计数单元加1,此时COP2000中要想判断进位只能判断最高位进位,所以需要将两个最低位数据左移四位,在两个数相加之前,需要加上进位位,此时进位位为0,两个左移四位的数据相加后,相加结果有进位,则跳转到ttt1,将两个最低位相加结果加上60H,进位位置1,然后右移四位,将最低位运算结果放到R2中,将计数器中的数与2相减,此时计数单元数据为1,1减2发生借位,所以执行JCt1,跳到t1,将最低两位结果放到0e0h单元保存。
然后程序跳转到tt2,最后将最低两位数与f0相与,最低两位数后四位清零,得到高四位,然后加上进位数,再将两个高四位数相加,判断是否有进位,若高四位相加有进位,跳转到ttt4中,将结果加上60,进位位置1,然后在进行判断,现在计数器中存储1,1减2发生借位,跳转到t2,将最低两位数的高位运算结果放到e0单元,然后取出中间两位数。
如果相加结果不发生进位则判断结果是否大于90,若结果大于90,则跳转到ttt5,将结果减10存储到内存中,同时进位位置1,然后跳转到ttt6,将计数单元里面存储的1减2,发生借位,跳转到t2,将最低两位数高位运算结果放入e1单元,然后将中间两位存储到R0与R1中。
如果相加结果小于9,跳转到ttt3,若结果小于90,将进位位置0跳转到ttt6,将计数单元里面存储的1减2,发生借位,跳转到t2,执行同上。
(d)中间数与最高两位数据运算结果同(c)。
(e)将最低两位数运算的结果存储到R2中,将中间两位运算的结果存到R1中,将最高两位运算结果存储到R0中。
2.2流程图的设计与实现
1.
存数过程。
如图2.2.1所示
图2.2.1存数据过程流程图
2.设计进位位单元与计数单元。
如图2.2.2所示
图2.2.2设计进位位单元与置数单元流程图
3.程序核心部分流程图。
如图2.2.3所示
图2.2.3核心部分流程图
第3章程序调试与结果测试
3.1程序调试
1.写指令时忘记在十六进制以字母开头的数前面加上0。
2.累加器A中的数据忘了及时保存在寄存器或者内存单元中,导致数据丢失,发生错误。
3.在写指令时犯了非常低级的错误,把ADD指令与AND指令弄混淆了,写AND指令时写成ADD指令,发现单步调试结果不对,仔细观察,发现马虎写错了。
4.在刚刚编写指令,还不是十分熟练的时候,有时候直接把内存单元的值直接写到寄存器里面,没有通过累加器A,全是马虎造成的。
3.2程序测试及结果分析
给出的数据:
296579与324856
运行结果为:
621435如图3.3.1所示
图3.3.1测试结果显示
测试数据为:
258579与364936
运行结果为:
623515如图3.3.2所示
图3.3.2测试结果显示
参考文献
[1]唐硕飞.计算机组成原理(第2版)[M].北京:
高等教育出版社,2008
[2]王爱英.计算机组成与结构(第4版)[M].北京:
高等教育出版社,2006
[3]COP2000实验指导书
附录(源代码)
mova,#29h;输入被加数
mov0f0h,a
mova,#65h
mov0f1h,a
mova,#79h
mov0f2h,a
mova,#32h;输入加数
mov0f3h,a
mova,#48h
mov0f4h,a
mova,#56h
mov0f5h,a
mova,#00h;计数器置零
mov0f6h,a
mova,#00h;进位位初始化
mov0f7h,a
mova,0f2h;取低位字节数
movr0,a
mova,0f5h
movr1,a
jmptt1
t1:
mova,r2;将最低两位数低位运算结果放入e0单元
mov0e0h,a
jmptt2
t2:
mova,r2;将最低两位数高位运算结果放入e1单元
mov0e1h,a
mova,0f1h;取中间两位数分别放入r0与r1中
movr0,a
mova,0f4h
movr1,a
jmptt1
t3:
mova,r2;将中间两位数低位运算结果放入e2单元
mov0e2h,a
jmptt2
t4:
mova,r2;将中间两位数高位运算结果放入e3单元
mov0e3h,a
mova,0f0h;取最高两位数
movr0,a
mova,0f3h
movr1,a
jmptt1
t5:
mova,r2;将最高两位数低位运算结果放入e4单元
mov0e4h,a
jmptt2
t6:
mova,r2;将最高两位数高位运算结果存入e5单元
mov0e5h,a
mova,0e0h;将最低两位数运算结果存入r2
adda,0e1h
movr2,a
mova,0e2h;将中间两位数运算结果存入r1
adda,0e3h
movr1,a
mova,0e4h;将最高两位数运算结果存入r0
adda,0e5h
movr0,a
loop:
jmploop
tt1:
mova,0f6h;计数器加1
adda,#01h
mov0f6h,a
mova,r0;r0左移四位
rla
rla
rla
rla
movr2,a
mova,r1;r1左移四位
rla
rla
rla
rla
movr3,a
adda,0f7h;加上进位
adda,r2;r2加上r3结果放入累加器
jcttt1;若相加结果有进位跳转ttt1
movr2,a;若相加结果无进位判断结果是否大于9
mova,#90h
suba,r2
jcttt2;若相加结果大于9跳转ttt2
mova,#00h;将计数器置零
mov0f7h,a
jmpttt3;若相加结果小于9跳转ttt3
ttt1:
adda,#60h;将累加器中数据加上60放入r2中
movr2,a
mova,#10h;进位位加1
mov0f7h,a
jmpttt3;跳转ttt3
ttt2:
;将结果减10放入r2中
mova,r2
suba,#0a0h
movr2,a
mova,#10h;进位位置1
mov0f7h,a
ttt3:
mova,r2;右移四次低位结果将结果放入r2中
rra
rra
rra
rra
movr2,a
mova,0f6h;将计数器中的数与2相减
suba,#02h
jct1;若计数器中的数为1则借位跳转t1
jzt3;若计数器中的数为2则跳转t3
jmpt5;否则跳转t5
tt2:
mova,r1;将最低8位数与f0相与,得到高四位
anda,#0f0h
movr3,a
mova,r0
anda,#0f0h
movr2,a
adda,0f7h;加上进位
adda,r3;高四位相加
jcttt4;若高四位相加发生进位跳转ttt4中
movr2,a;若无进位判断结结果是否大于90
mova,#90h
suba,r2
jcttt5;若结果大于90跳转ttt5
mova,#00h;若结果小于9,将进位位置0跳转到ttt6
mov0f7h,a
jmpttt6
ttt4:
adda,#60h;高四位加上60结果放入r2中
movr2,a
mova,#10h;进位位置1
mov0f7h,a
jmpttt6
ttt5:
mova,r2;将结果-10存入r2中
suba,#0a0h
movr2,a
mova,#10h;进位位置1
mov0e7h,a
jmpttt6;跳转到ttt6
ttt6:
mova,0f6h;计数器与2相减
suba,#02h
jct2;若结果为-1跳转t2
jzt4;若结果为0跳转t4
jmpt6;若结果为1跳转t6
课程设计总结:
通过这次课设,我首先明白了COP2000的使用方法,怎么用汇编语言编写指令程序。
我通过查阅相关资料、通过询问老师和同学,知道了COP2000只能判断最高位是否有进位,所以在判断最低位是否有进位时要左移四位。
巧妙地设计了计数单元,用JC、JZ与JMP来进行判断。
以前我通过书籍只是看到了MOV等指令,对其不了解,还有十六进制当以字母开头要加上0,现在用在COP2000里面进行实现,当输入错时,会提醒编译错误,我更好的理解了相关内容。
当自己经过2天的调试,终于达到课设任务书上的要求了。
通过这么多天对组原课程设计的了解,让我对计算机这个专业又有了更多的了解,我相信只要认真努力做一件事,成功就在眼前。
指导教师评语:
指导教师(签字):
年月日
课程设计成绩