




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与汇编语言实验报告学号:* 班级:* 姓名:* 指导教师:*一 实验目的 1. 通过上机实验进一步熟悉并掌握汇编语言的指令系统和寻址方式;2. 熟悉汇编语言程序上机的流程,以及与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等) 3. 学习汇编程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法4. 能够独自编写,调试,并成功运行一个完整的程序。二 实验内容与步骤1掌握汇编语言程序上机过程首先,新建文本文档后将扩展名改为.ASM,这是汇编语言源程序的文件格式,以记事本形式打开后在其中键入所编写的程序。第一次题目是在屏幕上显示一串字符串,在老师的指导下,编写的程序如下:data segment note db hello,$data endscode segment main proc far assume cs:code,ds:data,es:data start: push ds sub ax,ax push axmov ax,data mov ds,ax mov es,ax mov ah,09h lea dx,note int 21h main endpcode ends end start之后,要进行编译和运行。源程序经过翻译程序成为机器能够识别的目标程序,目标程序再经过连接程序连接后转换成在机器上可执行的程序。基本流程图如下:Xll.EXEXll.OBJXll.ASMMASM汇编程序LINK 连接程序在编译的过程中,程序查出的主要是语法上的错误,如果有错,则不能通过汇编,要纠错后重新汇编直到无错为止。最后,生成的.EXE文件即为可执行文件,从磁盘调入内存运行,得到运行结果。上述程序的运行结果为在屏幕上显示出“hello”。2.编程完成任意两个两位数的加法运算编程任务的基本要求为:从键盘输入任意两个两位数相加,将结果显示在屏幕上。刚开始拿到题目后,头脑里是比较混乱的。经过与同学的探讨之后,我们大概确定出要完成整个功能,需经过以下过程:将输入的ASCII码与十进制数值进行转换,并保存在寄存器中;通过调用程序将两个数相加,并将结果保存;将结果显示在屏幕上。虽然有一个基本的思路,但还是没有办法下手敲代码,于是在网上查找有关资料,网上的一些讲解和实例也给我们提供了一些启发。整个过程通过主程序调用子程序来完成,即如下格式:CALL 过程名RET过程以语句PROC开头,用语句ENDP结束。所以我理解这和我们学过的C+编程里调用函数是相似的,在C+中,首先将函数定义,而后在主程序中调用这些函数完成运算,而汇编语言中是定义子程序的功能,在主程序中调用这些功能进行运算。之后,我们开始尝试写代码,但仍然是参考网上的一些实例来进行。首先,数据段的定义:data segment indata dw 2 dup(?) outdata dw 1 dup(?) notein1 db please input the first decimal number(0-99):$ notein2 db please input the second decimal number(0-99):$ noteout db the result of addition is:$ notewarn db warning:wrong char!$ noteagain db please input again:$data endsshow macro addr mov ah,9h lea dx,addr int 21hendm这部分定义了在屏幕上现实的提示和输入数值的位数。值得一提的是宏定义这一部分:show为宏名,之后的三行代码是对9号功能的调用,即显示以$结尾的字符串,经此定义后,就可以在源程序中调用宏,只需在需要复制宏体的地方写宏的名字show即可。以上部分为第二次的实验过程,最终的程序没有写出来,但还是有一些收获的。第一,是将这个运算的基本过程理解了,特别是对于主程序调用子程序的方式有了更深一步的认识,将其类比到C+语言中更有利于学习,所以各种编程语言应该都是有相通之处的。第二,了解了宏指令的定义和调用,老师课上是讲解过的,但当时没有特别注意,现在自己写代码时才意识到这个问题。第三,自己写代码时才注意到基础知识的不牢固,通过这一过程巩固一下基本知识也算一个收获吧。第三次实验课,老师把完整的代码展示给我们并仔细的讲解了一遍。经过老师的讲解,我们对整个运算过程都有了比较清晰的理解,但再一次自己动手的时候又陷入昨天一样的困境,无从下手,只得根据网上的实例和老师的代码将过程基本还原,第二部分代码如下: code segment assume cs:code,ds:data,es:datamain proc far start: push ds sub ax,ax push ax mov ax,data mov ds,ax mov es,ax show notein1 call crlf call deci_input mov indata,bx call crlf show notein2 call crlf call deci_input mov indata+2,bx call crlf mov ax,bx add ax,indata mov outdata,ax show noteout call crlf call deci_output retmain endp首先前面一部分是汇编语言的基本框架,show notein1,show notein2,show noteout是通过调用宏来显示之前定义过的字符串。deci_input,deci_output为两个子程序,通过call来调用运行。mov,add等指令进行数据的传送和算术计算在这段代码中有这样两条语句:mov indata,bx和mov indata+2,bx,在数据定义中定义的是两个字变量来存放输入的数值,indata表示的是首地址,即第一个变量存放处,indata+2表示第二个变量存放处,2是偏移量。 接下来是子程序:deci_input proc near mov bx,0 newchar:mov ah,1 int 21h cmp al,0dh jz exit sub al,30h jl noteerr cmp al,9d jg noteerr cbw xchg ax,bx mov cx,10d mul cx xchg ax,bx add bx,ax jmp newchar noteerr:call crlf show notewarn call crlf show noteagain jmp newchar exit: retdeci_input endp这段子程序将键盘上输入的ASCII转换为十进制数并将其存放在寄存器中,在其中也对数值的位数进行了限制,限定于两位数。由于输入两个数的过程是一样的,所以其实就是进行了一次循环,两次调用的子程序都是一样的。两数相加的过程在主程序中完成,得到的结果存于相应寄存器,接下来的工作就是将其显示出来,用下面这段子程序:deci_output proc near mov bx,outdata mov cl,100d mov ax,bx div cl mov bl,ah mov dl,al add dl,30h call dispchar mov ax,0 mov al,bl cbw mov cl,10d div cl mov bl,ah mov dl,al add dl,30h call dispchar mov dl,bl add dl,30h call dispchar retdeci_output endp这就是整个运算的基本过程。第三次实验课主要是对于程序内部具体执行的一些细节的理解,对数据传送与储存,数值的转换过程都认识的更加深刻了一些。第四次实验课,经过大家共同的讨论和分析,所得代码已经能够正常编译并且运行。在这个过程中十分遗憾的是没有自己独立的写出这个程序的代码,基本上是按照网上的实例和老师的代码完成的,这充分说明自己距离独立编写程序还有一大段差距,需要做的努力还有很多。三 总结与收获这次实验没有真正独立写出代码,完成任务是很大的遗憾。在这个过我也总结了以下一些收获与不足: 1.对于基础知识的掌握不足,如寻址方式,指令系统等等,都没有充分理解其意义,反应在编程过程中就是无从下手,不知该写什么。其实编程的过程也是一个回顾知识的过程,这个过程对理解寻址方式等知识有很大的帮助。2.程序的调用是汇编程序中一个重要的部分,可以类比函数的调用,虽然有很大的区别,但这种思想应该是共通的。不同的功能用不同的子程序来完成,使得思路和过程会比较清晰。3.编程不是上来就敲代码,那样谁都写不出来,首先要充分的分析问题,改用怎样的思路解决,要分几步完成,每一步的步骤和作用又都是什么,这些问题是在写代码之前都要想清楚的,绝不可能一边写一遍去想过程,那样没有明确思路会越写越乱。4.老师也说过,编程就是一道坎,迈过去就会发现其实也并不是那么困难,但在迈的这个过程中是需要付出极大的努力,自己多写多练,代码不是看出来的而是自己写出来的,勤加练习才会有所收获。以上是我的一点感受和收获,不只是编程,任何一种技能都是要勤奋练习才有所得的。在此,也要感谢老师的帮助和辛勤指导。四附录完整的程序代码如下:data segment indata dw 2 dup(?) outdata dw 1 dup(?) notein1 db please input the first decimal number(0-99):$ notein2 db please input the second decimal number(0-99):$ noteout db the result of addition is:$ notewarn db warning:wrong char!$ noteagain db please input again:$data endsshow macro addr mov ah,9h lea dx,addr int 21hendmcode segment assume cs:code,ds:data,es:datamain proc far start: push ds sub ax,ax push ax mov ax,data mov ds,ax mov es,ax show notein1 call crlf call deci_input mov indata,bx call crlf show notein2 call crlf call deci_input mov indata+2,bx call crlf mov ax,bx add ax,indata mov outdata,ax show noteout call crlf call deci_output retmain endpdeci_input proc near mov bx,0 newchar:mov ah,1 int 21h cmp al,0dh jz exit sub al,30h jl noteerr cmp al,9d jg noteerr cbw xchg ax,bx mov cx,10d mul cx xchg ax,bx add bx,ax jmp newchar noteerr:call crlf show notewarn call crlf show noteagain jmp newchar exit: retdeci_input endpdeci_output proc near mov bx,outdata mov cl,100d mov ax,bx div cl mov bl,ah mov dl,al add dl,30h call dispchar mov ax,0 mov al,bl cbw mov cl,10d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川塔吊考试试题及答案
- 妊娠期高血压疾病护理
- 元宝创意美术课件
- 子痫抢救护理流程
- 神经内科不良事件管理规范
- 航空航天复合材料 课件 第4章 陶瓷基复合材料
- 不可撤销担保函在跨境融资租赁中的法律效力合同
- 拆迁公司责任保险合同范本
- 小儿鞘膜积液的护理查房
- 高新技术企业财务代理与研发资金支持协议
- 2025-2030年中国楼宇对讲系统行业市场深度调研及竞争格局与投资研究报告
- 暑假提升部编版小学语文四升五暑假阅读提升之概括文章中心思想 课件
- 2025年甘肃省陇南市事业单位招聘247人笔试参考题库及参考答案详解1套
- 2025至2030年中国航空发动机维修行业市场运营态势及发展前景研判报告
- 2025深圳语文中考作文(10篇)
- 2025春学期三年级语文下册教学工作总结 (三篇)
- 2025聊城市辅警考试试卷真题
- 标准文本-《水运工程大临建设标准化指南》
- T/CTRA 01-2020废轮胎/橡胶再生油
- 2025广西专业技术人员公需科目培训考试答案
- 2024年山东高中学业水平合格考试化学试卷真题(含答案详解)
评论
0/150
提交评论