数据传送及两个多位十进制数相加_第1页
数据传送及两个多位十进制数相加_第2页
数据传送及两个多位十进制数相加_第3页
数据传送及两个多位十进制数相加_第4页
数据传送及两个多位十进制数相加_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

深圳大学实验报告课程名称:微机原理及应用实验实验工程名称:数据传送及两个多位十进制数相加学院:物理科学与技术学院专业:应用物理指导教师:李雄军报告人:学号:班级:实验时间:实验报告提交时间:一、实验目的〔1〕继续熟练掌握在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程;〔2〕学习数据传送和算术运算指令的用法;〔3〕掌握子程序设计方法;〔4〕掌握宏汇编设计方法。实验内容将两个多位十进制数〔假设为16位二进制表示的无符号数〕相加。要求被加数均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回DATAl处。程序流程图显示加数和被加数显示加数和被加数赋计数值给CX加数和被加数以ASCⅡ码表示的数字串形式转化为由十六进制表示的数字串形式去除最低位进执行ADC带进位相加AAA调整结果送被加数区调整偏移量显示加数和被加数显示结果十六进制结果转化为ASCⅡCX-1=0开始结束算法说明:以42136与12547相加为例,首先将两个数中的每一位都以ASCII码存入相应的内存单元,然后将每一位数都减去30H,并将被加数和加数相对应位相加〔要考虑低位向高位的进位〕,存入相应的被加数存储单元中,最后将该单元中的每一位数转换成相应的ASCII码,调用DOS系统的显示字符指令,显示两数相加的结果。源程序代码DATASEGMENT;数据段

DATA1DB31H,33H,31H,31H,33H;定义DATA1为被加数

DATA2DB33H,33H,33H,32H,33H;定义DATA2为加数

DATAENDS;

STACKSEGMENTSTACK;堆栈段

STADB64DUP(0);SP_TOPDB0;定义SP_TOP单元数值为0

STACKENDS;堆栈段结束

CODESEGMENT;代码段

ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK;指定段存放器

CFLFMACRO;显示回车换行功能用宏定义CFLF实现,放在代码段最前面

MOVDL,0DH;回车〔0DH为回车的ASCII码〕MOVAH,02H;送DOS的中断调用功能号INT21H;DOS的中断调用MOVDL,0AH;用DOS功能调用实现换行,0AH为换行的ASCII码

MOVAH,02H;显示字符到屏幕上

INT21H;DOS中断调用

CFLFENDM;结束宏定义

START:MOVAX,DATA;设置数据段

MOVDS,AX;数据段初始化

MOVAX,STACK;设置堆栈段

MOVSS,AX;堆栈段初始化

MOVAL,SP_TOP;设置栈顶指针

MOVSI,OFFSETDATA1;显示被加数,并回车换行

MOVBX,05;

CALLDISPL;显示被加数,DISPL为显示子程序CFLF;回车、换行宏调用

MOVSI,OFFSETDATA2;显示加数

MOVBX,05;设置计数器赋值05

CALLDISPL;显示加数

CFLF;回车换行

CALLADDA;调用加法运算子程序

MOVSI,OFFSETDATA1;把DATA1的偏移量地址赋给SIMOVBX,05;CALLDISPL;显示结果

CFLF;回车、换行MOVAX,4C00H;返回DOS

INT21H;DOS中断调用

DISPLPROCNEAR;DISP为字符串显示子程序

DSL:MOVAH,02;送显示功能号MOVDL,[SI+BX-1];显示字符串中一字符INT21H;DOSINT21功能调用DECBX;BX-1,修改偏移量JNZDSL;假设BX不等于0,跳转到DSLRET;返回

DISPLENDP;子程序结束

ADDAPROCNEAR;加法子程序

MOVSI,OFFSETDATA1;取被加数的偏移地址

MOVDI,OFFSETDATA2;取加数偏移地址

MOVAH,0;进位清零

MOVCX,05;设置循环次数

AD1:

MOVAL,[SI];取被加数偏移量地址内容

SUBAL,30H;

MOVBL,[DI];取加数偏移量地址内容

SUBBL,30H;

ADDAL,BL;

ADDAL,AH;加上进位

MOVAH,0;进位清零

AAA;BCD十进制转换

MOV[SI],AL;存回DATA1的相应单元

INCDI;

INCSI;

DECCX;

JNZAD1;CX未减到0继续跳转,重新执行次位相加

MOVBX,05;

MOVSI,OFFSETDATA1;

AD2:

ADD[SI+BX-1],30H;相加之后转化为相应的ASCII码

DECBX;改变循环次数

JNEAD2;BX未减到0那么跳转至AD2

RET;返回

ADDAENDP;加法子程序结束

CODEENDS;代码段与程序结束ENDSTART;程序结束

实验结果1.编译、连接生成可执行文件,分别在debug和Emu8086下调试该可执行文件在debug下运行:在emu8086下运行:给出程序运行时的各段地址〔CS=?,DS=?SS=?ES=?〕及两个子程序入口的IP.DISPL:IP=0054ADDA:IP=0037CS=F400,DS=0710,SS=0711,ES=07003.试改变加数和被加数,如何从内存中观察结果的变化?总结子程序格式及其调用方法;结合本程序说明宏调用与子程序的区别。子程序是程序的一局部,可以被程序调用,当过程中的指令执行完后,返回程序调用点,调用过程的指令是CALL〔CALL过程名〕,从过程返回的指令为RET〔在子程序调用快要完成之时,加上RET.即在过程名ENDP指令之前加上RET指令〕。区别:1).在汇编后产生的.obj文件中,子程序定义依然存在,而宏定义却不复存在。

2).子程序调用是在执行时通过CALL指令完成的,而宏调用是在汇编时进行宏展开,被相应宏体所取代。

3).将屡次调用的一段代码定义为宏指令,与使用子程序相比,其执行速度要快〔因为过程需要调用和返回〕,但目标代码长。

4).宏指令的参数是在汇编时进行形实替换的,而子程序的参数是在执行时通过存放器或堆栈等方式传递的。实验总结这次实验能顺利开始进行最重要的还是依赖于预习,首先在课下想好该使用什么算法,然后画出程序流程图才可以很好地进行写代码,按步骤地依照流程图,就不会出现写程序写到一半卡住了。这次的实验对于偏移量的理解要求较强,因为对于被加数与加数各个数位相加而且要求两者都显示出来。而对子程序和宏调用也要预习,了解它们的定义、格式和区别。还有对源代码要清楚的区分开,比方指令ADC与ADD使用错误,会导致了进位的出错。思考题1.在键盘上输入一个字符或数字,要求:对十六进制数字〔由0-9,A~F或a~f组成〕,显示该数字的十进制值;当输入值为Q时结束程序,对其他输入提示输入不合法。画出程序流程图并请写出完整程序代码。答:源程序代码:DATASEGMENTSTRDB'PLEASEINPUTANUMBER(H):','$'WRONGDB'SORRY!THENUMBERISILLEGAL!','$'QUITDB'THEPROGRAMHASEXITED!','$'DATAENDSSTACKSEGMENTSTACK;堆栈段STADB64DUP(0)SP_TOPDB0STACKENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK;指定段存放器START:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXLP:LEADX,STRMOVAH,09HINT21HMOVAH,01HINT21HCALLJUDGECMPAL,51HJNZLP1MOVAH,4CHINT21HLP1:CALLCRLFJMPLPCRLFPROCNEARMOVDL,0DHMOVAH,02HINT21HMOVDL,0AHMOVAH,02HINT21HPOPAXRETCRLFENDP

温馨提示

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

评论

0/150

提交评论