多位十进制数加法器设计_第1页
多位十进制数加法器设计_第2页
多位十进制数加法器设计_第3页
多位十进制数加法器设计_第4页
多位十进制数加法器设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.深 圳 大 学 实 验 报 告 课程名称: 微机原理及应用实验 实验项目名称: 多位十进制数加法器设计 学院: 物理科学与技术学院 专业: 应用物理 指导教师: 报告人: 学号: 班级: 应用物理班 实验时间: 2015-10-19 实验报告提交时间: 2015-11-02 教务处制一、 实验名称: 多位十进制数加法器设计二、实验目的(1)继续熟练掌握在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程; (2)学习数据传送和算术运算指令的用法; (3)掌握子程序设计方法; (4)掌握宏汇编设计方法; (5)掌握键盘输出的DOS功能调用方法。三、实验内容(1)将两个多位十进制数相

2、加。要求被加数、加数均以ASCII码形式各自按高位高地址的规律分别顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回结果变量DATA3处,并屏幕显示结果。(2)在以上程序基础上,设计一个多位十进制数加法器,键盘输入十进制加数和被加数,将输入和输出结果以竖式形式显示在屏幕。四、实验任务分析与算法分析(软件实验)或实验电路及连线(硬件实验)实验及报告要求:)要求画出完整的程序流程图。)根据流程图和部分提示代码,编写完整的汇编代码源文件(特别是以上红字部分),并存入合适目录,要求补充写出所有未注释的伪指令和指令的注释;)编译、连接生成可执行文件,分别在和Emu8086下调试

3、该可执行文件,给出程序运行时的各段地址(?,?)及两个子程序入口的IP; 试改变加数和被加数,如何从内存中观察结果的变化?总结子程序格式及其调用方法;结合本程序说明宏调用与子程序的区别。)写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。)实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法、汇编指令及汇编语言编程方法、微机原理学习方法作出总结。实验任务1. 将两个多位十进制数相加。要求被加数、加数均以ASCII码形式各自按高位高地址的规律分别顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回结果变量DATA3处,并屏幕显示

4、结果。算法分析: 定义两个加数,并分别存至两个变量之中;分别取变量中的对应万千百十个位上的数,由ASCII码转换成数值后,对应位相加(使用带进位的加法命令),得到的数值保存至结果变量的对应位上,并调用DOS屏幕显示字符功能显示。功能: 将被加数和加数分别显示,接着运行加法运算,然后将结果显示出来。     算法说明:  定义数据段:定义被加数和加数,且要使其用ASCII码以十六进制之间的转换;  定义堆栈段,并给SP_TOP单元赋初值0;  定义代码段,并将源代码放在里面   

5、;首先,编写主程序;   接着,编写显示、回车换行和加法运算的子程序。 程序结束。 所用到的寄存:AX、SS 、CS 、DS、 ES、SI、SP、DI五、程序说明(预习)六、源程序清单及其每句的注释1.没有键盘录入的源程序CRLF MACRO ;回车换行宏定义 MOV AH,02 MOV DL,0DH INT 21H MOV AH,02 MOV DL,0AH INT 21H ENDM DATA SEGMENT ; 数据段DATA1 DB 35H,34H,33H,32H,35H ;代表12345 DATA2 DB 3

6、0H,32H,34H,36H,38H ;代表86420DATA3 DB 6 DUP(0), '$' CARY DB 0 DATA ENDSSTACK SEGMENT STACK ; 堆栈段 STA DB 64 DUP(0)STACK_TOP DB 0STACK ENDSCODE SEGMENT ; 代码段 ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START: ; 程序开头必须要有的五条指令 MOV AX, DATA MOV DS, AX ; 设置数据段 MOV AX, STACK MOV SS, AX ; 设置堆栈段 LEA

7、SP, STACK_TOP ; 设置栈顶指针;- ; 程序的中间部分 LEA BX,DATA1 ;加数1送至BX,传至子程序DISP的形参 CALL DISP ;调用显示字符串子程序,将第一个加数显示到屏幕 LEA BX,DATA2 ;加数2送至BX,传至子程序DISP的形参 CALL DISP ;调用显示字符串子程序,将第一个加数显示到屏幕 LEA BX, DATA1 ;加数1送至BX MOV SI,0 ;定义指针SI依次指向变量单元的下一个数据,相当指针 MOV CX,5 ;设置循环次数5NEXT1: SUB BYTE PTR BXSI,30H ;将BX里面的对应存储单元的字符串ASCII

8、码转换为对应二进制 INC SI ;指针自加一 LOOP NEXT1 ;循环执行 LEA BX, DATA2 ;加数1送至BX MOV SI,0 ;定义指针SI依次指向变量单元的下一个数据,相当指针 MOV CX,5 ;设置循环次数5NEXT2: SUB BYTE PTR BXSI,30H ;将BX里面的对应存储单元的字符串ASCII码转换为对应二进制 INC SI ;指针自加一 LOOP NEXT2 ;循环执行 CLC ;清屏 CALL ADDC ;调用加法子程序 LEA DX, DATA3 ;调用DOS功能09号,显示字符串,把最终结果显示到屏幕上 MOV AH,9 INT 21H ;-

9、; 程序结束必须要有的两条指令 MOV AX, 4C00H ; INT 21H ; ;- ;显示字符串子程序DISP PROC ; 子程序定义 MOV SI,5 DSP: MOV AH, 2 ; 送显示功能号 MOV DL,BX+SI-1 ; 显示字符串中一字符 INT 21H ; DOS INT 21 功能调用 DEC SI ;修改偏移量 CMP SI,0 JNZ DSP CRLF ;宏调用 RETDISP ENDP;加法子程序ADDC PROC ; 子程序定义 LEA SI,DATA1 ;加数1有效偏移地址送至SI LEA DI,DATA2 ;加数2有效偏移地址送至DI LEA BX, D

10、ATA3 ;结果变量的基地址送至BX ADD BX,5 ;设置相加次数 MOV CX,5 ;设置循环次数 AD: MOV AL,BYTE PTRSI ;指针SI指向的内存单元的内容转换类型属性送至AL ADC AL,BYTE PTRDI ;指针SI指向的内存单元的内容转换类型属性相加后送至AL AAA ;加法十进制调整 JC SETCARY ;判断是否进位,是跳至SETCARY MOV CARY,0 ;否,进位变量置0 JMP NEXT ;无条件跳转NEXT SETCARY:MOV CARY,1 ;进位变量置1 NEXT: ADD AL,30H ;AL中数据进行ASCII码调整 MOV BYT

11、E PTR BX,AL ;将得到的AL最终结果送至BX基地址对应的内存区 INC SI ;修改偏移量 INC DI DEC BX LOOP AD ;循环执行 CMP CARY,1 ;判断进位变量是否为1 JZ CAY ;是,跳转至CAY MOV BYTE PTR BX,20H ;否则退格 JMP EXITCAY: MOV BYTE PTR BX,31H;是,置1 EXIT: RETADDC ENDP CODE ENDS END START ; 最后一行要按回车键2.带键盘录入的源程序; 将 AX中的三位数拆为三个BCD码, 并存入数据段 BCD0 开始的三个单元DATA SEGMENT ; 数

12、据段 INSTR1 DB 6,0,6 DUP(0) ; 定义被加数ASCII变量 INSTR2 DB 6,0,6 DUP(0) ; 定义加数ASCII变量 NUM1 DB 5 DUP(0) ; 定义被加数bcd变量 NUM2 DB 5 DUP(0) ; 定义加数bcd变量 RESULT DB 6 DUP(0) ; 结果bcd显示STRING0 DB 0DH,0AH,0AH,'You want to play? Enter Y to play; Any key to exit.$'STRING1 DB 'Please enter the Additions Number:

13、',0AH,0DH,'$'STRING2 DB ' + ','$'STRING3 DB ' = ','$'DATA ENDS ;显示回车换行功能用宏定义CRLF实现,放在代码段最前面CRLF MACRO MOV DL,0DH ;回车(0DH为回车的ASCII 码 ) MOV AH,02H ; 送DOS 的中断调用功能号 INT 21H ; DOS 的中断调用 MOV DL,0AH ;换行(0AH为回车的ASCII 码 ) MOV AH,02H ; 送DOS 的中断调用功能号 INT 21H ; DOS 的中

14、断调用 ENDM STACK SEGMENT STACK ; 堆栈段 STA DB 64 DUP(0)STACK_TOP DB 0STACK ENDSCODE SEGMENT ; 代码段 ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START: ; 程序开头必须要有的五条指令 MOV AX, DATA MOV DS, AX ; 设置数据段 MOV AX, STACK MOV SS, AX ; 设置堆栈段 LEA SP, STACK_TOP ; 设置栈顶指针 MOV AH,09HLEA DX,STRING1INT 21HCRLF LEA DX, I

15、NSTR1 ;指针 MOV AH,0AH ; 从屏幕输入字符 INT 21H LEA SI,INSTR1 ;被加数的初始偏移量,0 LEA DI,NUM1 ;被加数BCD的初始偏移量,0 MOV BL,SI+1 ;BL=从屏幕输入多少个数 MOV BH,0 MOV CX,BX INC BXL1: MOV AL,SI+BX ; 将被加数ASCII变成BCD SUB AL,30H MOV DI,AL DEC SI ; SI-1,DI+1 INC DI LOOP L1 ;cx不等于0时循环MOV AH,09HLEA DX,STRING2INT 21H LEA DX, INSTR2 ;指针 MOV A

16、H,10 ; 从屏幕输入字符 INT 21H LEA SI,INSTR2 ;指针 LEA DI,NUM2 MOV BL,SI+1 ;BL=从屏幕输入多少个数 MOV BH,0 MOV CX,BX INC BX L2: MOV AL,SI+BX ; 将加数ASCII变成BCD SUB AL,30H MOV DI,AL ; SI-1,DI+1 DEC SI INC DI LOOP L2 ;cx不等于0时循环 CALL ADDA ;调用加法运算子程序 JC L6 MOV CL,0 ; 提取进位 JMP L7 L6: MOV CL,1L7: LEA SI,RESULT LEA DI,INSTR1 MO

17、V BYTE PTRSI+5,CL ; 将进位赋值给结果的第5个偏移量 CALL DISPL ; 显示结果,DISPL为显示子程序EXIT: MOV AX,4C00H ; 返回DOS(两句) INT 21H ; 以上两句返回DOS ;DISPL为字符串显示子程序 DISPL PROC NEAR ; 子程序定义 MOV CX,6 ; 最大有6位数输出,循环执行六次 MOV BX,5 ; 不为0的最高位的位数S2: MOV AL,SI+5 CMP AL,0 JZ S1 ; 如果最高位为0,则跳转到S1 JMP S3S1: DEC CX ; 数的长度减1 DEC BX DEC SI JMP S2S3

18、: LEA SI,RESULT LEA DI,INSTR1 LEA DX,STRING3MOV AH,09HINT 21HL5: MOV AL,SI+BX ; 从不为0的最高位开始提取数据 ADD AL,30H MOV AH,02H MOV DL,AL ; 在屏幕上显示 INT 21H DEC SI LOOP L5 ;cx不等于0时循环 RET DISPL ENDP ; 多位数加法子程序 ADDA PROC NEAR ;需要自编的求和核心程序 CLC ;清零 LEA SI,NUM1 LEA DI,NUM2 LEA BX,RESULT MOV CX,5 MOV DL,0L3: MOV AL,SI

19、 ADC AL,DI ;带进位加法 AAA ;十进制调整 MOV BYTE PTRBX,AL ;赋值给RESULT INC SI INC DI INC BX LOOP L3 ;cx不等于0时循环 RETADDA ENDP ;代码段与程序结束 CODE ENDS END START ; 程序最后一行要输入回车七、实验源程序清单(实验后以电子报告形式存储到指定位置)1 源程序路径及文件名:ADD2.ASM ADD1.ASM2 可执行程序路径及文件名: 八、上机调试情况说明EMU8086:一:没有键盘录入1.结果显示如下:2.程序运行时的各段地址:3.两个子程序IP入口:4.改变两个加数数值5.子程

20、序格式及其调用方法和宏汇编区别子程序格式:子程序名称 PROC NEAR ; 子程序定义 ; 子程序内容 RET ;子程序返回 子程序名称 ENDP ;子程序结束调用格式:CALL 子程序名称注意事项:1、子程序不能直接传递参数,需要自行定义变量。2、注意保护现场和恢复现场。宏汇编与子程序的区别:1、宏汇编有宏展开,子程序没有2、宏汇编可以传递参数。二:键盘录入 DOS:例如:250+250=500例如:62142+63123=125265九、实验结果与分析结果如下:十、实验总结(必备部分,评分重要依据之一) 本次实验实则是对实验二的加强巩固基础上,进行更加友好的人机交互设计;通过本次实验不仅

21、在程序中首先把两个加数固定,在实验二的基础上扩展位数,考虑到最高位进位的情况,并最终得出正确结果;后来又通过键盘录入两个加数,增加了人机交互的设计,如此一来,更加加深了对寄存器的使用,汇编语言宏定义,子程序调用以及DOS功能调用的学习。同时,通过本次实验的学习,更加熟练了EMU8086工具的使用,也把理论课上学习到的汇编操作指令实际操作,对汇编语言的风格加深认识。十一、思考题: (1) 在键盘上输入一个字符或数字,要求:对十六进制数字(由09,AF或af组成),显示该数字的十进制值;当输入值为Q时结束程序,对其他输入提示输入不合法。画出程序流程图并请写出完整程序代码。(必做)DATA SEGM

22、ENT ;数据段 STRING1 DB 'PLEASE INPUT A NUMBER:$'STRING2 DB 'YOU HAD INPUT: $'STRING3 DB 'INPUT ERROR! PLEASE INPUT AGAIN.$'STRING4 DB 'EXIT SUCCESSFULLY$'DATA ENDS STACK SEGMENT STACK ;堆栈段STA DB 64 DUP(0)SP_TOP DB 0STACK ENDSCODE SEGMENT ; 代码段 ASSUME DS:DATA CS:CODE, ES:

23、DATA , SS:STACK;补充必要的代码START: MOV AX,DATA; 补充必要的代码:程序开头必须要有的五条指令 MOV DS,AX MOV AX,STACK MOV SS,AX LEA SP,SP_TOP CRLF MACRO MOV DL,0DH ;回车(0DH为回车的ASCII 码 ) MOV AH,02H ; 送DOS 的中断调用功能号 INT 21H ; DOS 的中断调用 MOV DL,0AH ;换行(0AH为回车的ASCII 码 ) MOV AH,02H ; 送DOS 的中断调用功能号 INT 21H ; DOS 的中断调用 ENDMBEGIN: MOV AH,0

24、9H ;显示输入提示 LEA DX,STRING1 INT 21H MOV AH,1 ;读键盘 INT 21H MOV BL,AL CMP BL,51H ;判断是否是Q JE EXIT CMP BL,71H JE EXIT CMP BL,30H ;判断字符是否在0和9之间 JB ERROR CMP BL,3AH JNB N1 CRLF ;显示09 MOV AH,09H LEA DX,STRING2 INT 21H MOV AH,02H MOV DL,BL INT 21H CRLF JMP BEGIN N1: CMP BL,41H ;判断字符是否在'A'和'F'之间 JB ERROR CMP BL,47H JNB N2 SUB BL,65 CRLF MOV AH,09H ;显示1015 LEA DX,STRING2 INT 21H MOV AH,2 MOV DL,31H INT 21H MOV AH,2 ADD BL,3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论