多位十进制数加法器设计.docx
- 文档编号:13529143
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:24
- 大小:396.82KB
多位十进制数加法器设计.docx
《多位十进制数加法器设计.docx》由会员分享,可在线阅读,更多相关《多位十进制数加法器设计.docx(24页珍藏版)》请在冰点文库上搜索。
多位十进制数加法器设计
深圳大学实验报告
课程名称:
微机原理及应用实验
实验项目名称:
多位十进制数加法器设计
学院:
物理科学与技术学院
专业:
应用物理
指导教师:
报告人:
学号:
班级:
应用物理班
实验时间:
2015-10-19
实验报告提交时间:
2015-11-02
教务处制
一、实验名称:
多位十进制数加法器设计
二、实验目的
(1)继续熟练掌握在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程;
(2)学习数据传送和算术运算指令的用法;
(3)掌握子程序设计方法;
(4)掌握宏汇编设计方法;
(5)掌握键盘输出的DOS功能调用方法。
三、实验内容
(1)将两个多位十进制数相加。
要求被加数、加数均以ASCII码形式各自按高位高地址的规律分别顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回结果变量DATA3处,并屏幕显示结果。
(2)在以上程序基础上,设计一个多位十进制数加法器,键盘输入十进制加数和被加数,将输入和输出结果以竖式形式显示在屏幕。
四、实验任务分析与算法分析(软件实验)或实验电路及连线(硬件实验)
实验及报告要求:
1)要求画出完整的程序流程图。
2)根据流程图和部分提示代码,编写完整的汇编代码源文件(特别是以上红字部分),并存入合适目录,要求补充写出所有未注释的伪指令和指令的注释;
3)编译、连接生成可执行文件,分别在debug和Emu8086下调试该可执行文件,给出程序运行时的各段地址(CS=?
,DS=?
SS=?
ES=?
)及两个子程序入口的IP;试改变加数和被加数,如何从内存中观察结果的变化?
总结子程序格式及其调用方法;结合本程序说明宏调用与子程序的区别。
4)写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。
5)实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法、汇编指令及汇编语言编程方法、微机原理学习方法作出总结。
实验任务1.
将两个多位十进制数相加。
要求被加数、加数均以ASCII码形式各自按高位高地址的规律分别顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回结果变量DATA3处,并屏幕显示结果。
算法分析:
定义两个加数,并分别存至两个变量之中;分别取变量中的对应万千百十个位上的数,由ASCII码转换成数值后,对应位相加(使用带进位的加法命令),得到的数值保存至结果变量的对应位上,并调用DOS屏幕显示字符功能显示。
功能:
将被加数和加数分别显示,接着运行加法运算,然后将结果显示出来。
算法说明:
1定义数据段:
定义被加数和加数,且要使其用ASCII码以十六进制之间的转换;
2定义堆栈段,并给SP_TOP单元赋初值0;
3定义代码段,并将源代码放在里面 首先,编写主程序;
接着,编写显示、回车换行和加法运算的子程序。
④程序结束。
所用到的寄存:
AX、SS 、CS 、DS、 ES、SI、SP、DI
五、程序说明(预习)
六、源程序清单及其每句的注释
1.没有键盘录入的源程序
CRLFMACRO;回车换行宏定义
MOVAH,02
MOVDL,0DH
INT21H
MOVAH,02
MOVDL,0AH
INT21H
ENDM
DATASEGMENT;数据段
DATA1DB35H,34H,33H,32H,35H;代表12345
DATA2DB30H,32H,34H,36H,38H;代表86420
DATA3DB6DUP(0),'$'
CARYDB0
DATAENDS
STACKSEGMENTSTACK;堆栈段
STADB64DUP(0)
STACK_TOPDB0
STACKENDS
CODESEGMENT;代码段
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
;程序开头必须要有的五条指令
MOVAX,DATA
MOVDS,AX;设置数据段
MOVAX,STACK
MOVSS,AX;设置堆栈段
LEASP,STACK_TOP;设置栈顶指针
;---------------------------------------
;程序的中间部分
LEABX,DATA1;加数1送至BX,传至子程序DISP的形参
CALLDISP;调用显示字符串子程序,将第一个加数显示到屏幕
LEABX,DATA2;加数2送至BX,传至子程序DISP的形参
CALLDISP;调用显示字符串子程序,将第一个加数显示到屏幕
LEABX,DATA1;加数1送至BX
MOVSI,0;定义指针SI依次指向变量单元的下一个数据,相当指针
MOVCX,5;设置循环次数5
NEXT1:
SUBBYTEPTR[BX][SI],30H;将BX里面的对应存储单元的字符串ASCII码转换为对应二进制
INCSI;指针自加一
LOOPNEXT1;循环执行
LEABX,DATA2;加数1送至BX
MOVSI,0;定义指针SI依次指向变量单元的下一个数据,相当指针
MOVCX,5;设置循环次数5
NEXT2:
SUBBYTEPTR[BX][SI],30H;将BX里面的对应存储单元的字符串ASCII码转换为对应二进制
INCSI;指针自加一
LOOPNEXT2;循环执行
CLC;清屏
CALLADDC;调用加法子程序
LEADX,DATA3;调用DOS功能09号,显示字符串,把最终结果显示到屏幕上
MOVAH,9
INT21H
;------------------------------------------
;程序结束必须要有的两条指令
MOVAX,4C00H;
INT21H;
;------------------------------------------
;显示字符串子程序
DISPPROC;子程序定义
MOVSI,5
DSP:
MOVAH,2;送显示功能号
MOVDL,[BX+SI-1];显示字符串中一字符
INT21H;DOSINT21功能调用
DECSI;修改偏移量
CMPSI,0
JNZDSP
CRLF;宏调用
RET
DISPENDP
;加法子程序
ADDCPROC;子程序定义
LEASI,DATA1;加数1有效偏移地址送至SI
LEADI,DATA2;加数2有效偏移地址送至DI
LEABX,DATA3;结果变量的基地址送至BX
ADDBX,5;设置相加次数
MOVCX,5;设置循环次数
AD:
MOVAL,BYTEPTR[SI];指针SI指向的内存单元的内容转换类型属性送至AL
ADCAL,BYTEPTR[DI];指针SI指向的内存单元的内容转换类型属性相加后送至AL
AAA;加法十进制调整
JCSETCARY;判断是否进位,是跳至SETCARY
MOVCARY,0;否,进位变量置0
JMPNEXT;无条件跳转NEXT
SETCARY:
MOVCARY,1;进位变量置1
NEXT:
ADDAL,30H;AL中数据进行ASCII码调整
MOVBYTEPTR[BX],AL;将得到的AL最终结果送至BX基地址对应的内存区
INCSI;修改偏移量
INCDI
DECBX
LOOPAD;循环执行
CMPCARY,1;判断进位变量是否为1
JZCAY;是,跳转至CAY
MOVBYTEPTR[BX],20H;否则退格
JMPEXIT
CAY:
MOVBYTEPTR[BX],31H;是,置1
EXIT:
RET
ADDCENDP
CODEENDS
ENDSTART;最后一行要按回车键
2.带键盘录入的源程序
;将AX中的三位数拆为三个BCD码,并存入数据段BCD0开始的三个单元
DATASEGMENT;数据段
INSTR1DB6,0,6DUP(0);定义被加数ASCII变量
INSTR2DB6,0,6DUP(0);定义加数ASCII变量
NUM1DB5DUP(0);定义被加数bcd变量
NUM2DB5DUP(0);定义加数bcd变量
RESULTDB6DUP(0);结果bcd显示
STRING0DB0DH,0AH,0AH,'Youwanttoplay?
EnterYtoplay;Anykeytoexit.$'
STRING1DB'PleaseentertheAdditionsNumber:
',0AH,0DH,'$'
STRING2DB'+','$'
STRING3DB'=','$'
DATAENDS
;显示回车换行功能用宏定义CRLF实现,放在代码段最前面
CRLFMACRO
MOVDL,0DH;回车(0DH为回车的ASCII码)
MOVAH,02H;送DOS的中断调用功能号
INT21H;DOS的中断调用
MOVDL,0AH;换行(0AH为回车的ASCII码)
MOVAH,02H;送DOS的中断调用功能号
INT21H;DOS的中断调用
ENDM
STACKSEGMENTSTACK;堆栈段
STADB64DUP(0)
STACK_TOPDB0
STACKENDS
CODESEGMENT;代码段
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
;程序开头必须要有的五条指令
MOVAX,DATA
MOVDS,AX;设置数据段
MOVAX,STACK
MOVSS,AX;设置堆栈段
LEASP,STACK_TOP;设置栈顶指针
MOVAH,09H
LEADX,STRING1
INT21H
CRLF
LEADX,INSTR1;指针
MOVAH,0AH;从屏幕输入字符
INT21H
LEASI,INSTR1;被加数的初始偏移量,0
LEADI,NUM1;被加数BCD的初始偏移量,0
MOVBL,[SI+1];BL=从屏幕输入多少个数
MOVBH,0
MOVCX,BX
INCBX
L1:
MOVAL,[SI+BX];将被加数ASCII变成BCD
SUBAL,30H
MOV[DI],AL
DECSI;SI-1,DI+1
INCDI
LOOPL1;cx不等于0时循环
MOVAH,09H
LEADX,STRING2
INT21H
LEADX,INSTR2;指针
MOVAH,10;从屏幕输入字符
INT21H
LEASI,INSTR2;指针
LEADI,NUM2
MOVBL,[SI+1];BL=从屏幕输入多少个数
MOVBH,0
MOVCX,BX
INCBX
L2:
MOVAL,[SI+BX];将加数ASCII变成BCD
SUBAL,30H
MOV[DI],AL;SI-1,DI+1
DECSI
INCDI
LOOPL2;cx不等于0时循环
CALLADDA;调用加法运算子程序
JCL6
MOVCL,0;提取进位
JMPL7
L6:
MOVCL,1
L7:
LEASI,RESULT
LEADI,INSTR1
MOVBYTEPTR[SI+5],CL;将进位赋值给结果的第5个偏移量
CALLDISPL;显示结果,DISPL为显示子程序
EXIT:
MOVAX,4C00H;返回DOS(两句)
INT21H;以上两句返回DOS
;DISPL为字符串显示子程序
DISPLPROCNEAR;子程序定义
MOVCX,6;最大有6位数输出,循环执行六次
MOVBX,5;不为0的最高位的位数
S2:
MOVAL,[SI+5]
CMPAL,0
JZS1;如果最高位为0,则跳转到S1
JMPS3
S1:
DECCX;数的长度减1
DECBX
DECSI
JMPS2
S3:
LEASI,RESULT
LEADI,INSTR1
LEADX,STRING3
MOVAH,09H
INT21H
L5:
MOVAL,[SI+BX];从不为0的最高位开始提取数据
ADDAL,30H
MOVAH,02H
MOVDL,AL;在屏幕上显示
INT21H
DECSI
LOOPL5;cx不等于0时循环
RET
DISPLENDP
;多位数加法子程序
ADDAPROCNEAR
;需要自编的求和核心程序
CLC;清零
LEASI,NUM1
LEADI,NUM2
LEABX,RESULT
MOVCX,5
MOVDL,0
L3:
MOVAL,[SI]
ADCAL,[DI];带进位加法
AAA;十进制调整
MOVBYTEPTR[BX],AL;赋值给RESULT
INCSI
INCDI
INCBX
LOOPL3;cx不等于0时循环
RET
ADDAENDP
;代码段与程序结束
CODEENDS
ENDSTART;程序最后一行要输入回车
七、实验源程序清单(实验后以电子报告形式存储到指定位置)
1.源程序路径及文件名:
ADD2.ASMADD1.ASM
2.可执行程序路径及文件名:
八、上机调试情况说明
EMU8086:
一:
没有键盘录入
1.结果显示如下:
2.程序运行时的各段地址:
3.两个子程序IP入口:
4.改变两个加数数值
5.子程序格式及其调用方法和宏汇编区别
子程序格式:
子程序名称PROCNEAR;子程序定义
;…子程序内容
RET;子程序返回
子程序名称ENDP;子程序结束
调用格式:
CALL子程序名称
注意事项:
1、子程序不能直接传递参数,需要自行定义变量。
2、注意保护现场和恢复现场。
宏汇编与子程序的区别:
1、宏汇编有宏展开,子程序没有
2、宏汇编可以传递参数。
二:
键盘录入
DOS:
例如:
250+250=500
例如:
62142+63123=125265
九、实验结果与分析
结果如下:
十、实验总结(必备部分,评分重要依据之一)
本次实验实则是对实验二的加强巩固基础上,进行更加友好的人机交互设计;通过本次实验不仅在程序中首先把两个加数固定,在实验二的基础上扩展位数,考虑到最高位进位的情况,并最终得出正确结果;后来又通过键盘录入两个加数,增加了人机交互的设计,如此一来,更加加深了对寄存器的使用,汇编语言宏定义,子程序调用以及DOS功能调用的学习。
同时,通过本次实验的学习,更加熟练了EMU8086工具的使用,也把理论课上学习到的汇编操作指令实际操作,对汇编语言的风格加深认识。
十一、思考题:
(1)在键盘上输入一个字符或数字,要求:
对十六进制数字(由0-9,A~F或a~f组成),显示该数字的十进制值;当输入值为Q时结束程序,对其他输入提示输入不合法。
画出程序流程图并请写出完整程序代码。
(必做)
DATASEGMENT;数据段
STRING1DB'PLEASEINPUTANUMBER:
$'
STRING2DB'YOUHADINPUT:
$'
STRING3DB'INPUTERROR!
PLEASEINPUTAGAIN.$'
STRING4DB'EXITSUCCESSFULLY$'
DATAENDS
STACKSEGMENTSTACK;堆栈段
STADB64DUP(0)
SP_TOPDB0
STACKENDS
CODESEGMENT;代码段
ASSUMEDS:
DATACS:
CODE,ES:
DATA,SS:
STACK;补充必要的代码
START:
MOVAX,DATA;补充必要的代码:
程序开头必须要有的五条指令
MOVDS,AX
MOVAX,STACK
MOVSS,AX
LEASP,SP_TOP
CRLFMACRO
MOVDL,0DH;回车(0DH为回车的ASCII码)
MOVAH,02H;送DOS的中断调用功能号
INT21H;DOS的中断调用
MOVDL,0AH;换行(0AH为回车的ASCII码)
MOVAH,02H;送DOS的中断调用功能号
INT21H;DOS的中断调用
ENDM
BEGIN:
MOVAH,09H;显示输入提示
LEADX,STRING1
INT21H
MOVAH,1;读键盘
INT21H
MOVBL,AL
CMPBL,51H;判断是否是Q
JEEXIT
CMPBL,71H
JEEXIT
CMPBL,30H;判断字符是否在’0’和’9’之间
JBERROR
CMPBL,3AH
JNBN1
CRLF;显示0~9
MOVAH,09H
LEADX,STRING2
INT21H
MOVAH,02H
MOVDL,BL
INT21H
CRLF
JMPBEGIN
N1:
CMPBL,41H;判断字符是否在'A'和'F'之间
JBERROR
CMPBL,47H
JNBN2
SUBBL,65
CRLF
MOVAH,09H;显示10~15
LEADX,STRING2
INT21H
MOVAH,2
MOVDL,31H
INT21H
MOVAH,2
ADDBL,30H
MOVDL,BL
INT21H
CRLF
JMPBEGIN
N2:
CMPBL,61H;判断字符是否在'a'和'f'之间
JBERROR
CMPBL,67H
JNBERROR
SUBBL,97;显示10~15
CRLF
MOVAH,09H
LEADX,STRING2
INT21H
MOVAH,2
MOVDL,31H
INT21H
MOVAH,2
ADDBL,30H
MOVDL,BL
INT21H
CRLF
JMPBEGIN
ERROR:
CRLF
MOVAH,09H;显示输入错误
LEADX,STRING3
INT21H
CRLF
JMPBEGIN
EXIT:
CRLF
MOVAH,09H;显示成功退出
LEADX,STRING4
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2)请问你的程序能否处理加数和被加数都介于0~65535范围但计算结果超出该范围的情况?
如何改进?
可以,如图:
主要考虑到最高位是否进位,可以设置一个进位变量加以判断。
(3)加数或被加数为负数,结果是否正确,输出格式上作何处理?
答:
如果加数或被加数为负数,结果不正确。
设想:
可以在输入格式上,判断第一位的ASCII码是否为“-”,如果为负,则可以将数字转化为其补码再作加法运算,如果两数的和也为负数,则在也输出格式上将结果转化为补码表示。
指导教师批阅意见:
成绩评定:
预习情况(20)
实验过程(35)
实验报告(45)
总分
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
3.实验过程与实验报告评分比例会根据具体实验来调整。
4.务必把实验课前老师签字了的预习报告附上,否则不予评分。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 十进制 加法器 设计