微机原理与汇编语言实验报告_第1页
微机原理与汇编语言实验报告_第2页
微机原理与汇编语言实验报告_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、微机原理与汇编语言实验报告学号:*班级:*姓名:*指导教师:*一. 实验目的1. 通过上机实验进一步熟悉并掌握汇编语言的指令系统和寻址方式;2. 熟悉汇编语言程序上机的流程,以及与实验有关的系统软件(如编辑程序、 汇编程序、连接程序和调试程序等)3. 学习汇编程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、 调试和运行程序的方法4. 能够独自编写,调试,并成功运行一个完整的程序。二. 实验内容与步骤1. 掌握汇编语言程序上机过程首先,新建文本文档后将扩展名改为.ASM,这是汇编语言源程序的文件格式, 以记事本形式打开后在其中键入所编写的程序。 第一次题目是在屏幕上显示一串 字符串,在老

2、师的指导下,编写的程序如下:data segme ntn ote db 'hello','$'data endscode segme ntmai n proc farassume cs:code,ds:data,es:datastart:push dssub ax,axpush axmov ax,datamov ds,axmov es,axmov ah,09hlea dx,note int 21h main endpcode endsend start之后,要进行编译和运行。源程序经过翻译程序成为机器能够识别的目标程 序,目标程序再经过连接程序连接后转换成在机器

3、上可执行的程序。基本流程图如下:在编译的过程中,程序查出的主要是语法上的错误, 如果有错,则不能通过汇编,要纠错后重新汇编直到无错为止。最后,生成的.EXE文件即为可执行文件,从磁盘调入内存运行,得到运行 结果。上述程序的运行结果为在屏幕上显示出“hello ”。2. 编程完成任意两个两位数的加法运算编程任务的基本要求为:从键盘输入任意两个两位数相加,将结果显示在屏 幕上。刚开始拿到题目后,头脑里是比较混乱的。经过与同学的探讨之后,我们大 概确定出要完成整个功能,需经过以下过程:将输入的ASCII码与十进制数值进 行转换,并保存在寄存器中;通过调用程序将两个数相加,并将结果保存;将结 果显示在

4、屏幕上。虽然有一个基本的思路,但还是没有办法下手敲代码,于是在网上查找有关 资料,网上的一些讲解和实例也给我们提供了一些启发。整个过程通过主程序调 用子程序来完成,即如下格式:CALL过程名RET过程以语句PRO(开头,用语句ENDP吉束。所以我理解这和我们学过的 C+h编程 里调用函数是相似的,在 C+中,首先将函数定义,而后在主程序中调用这些函 数完成运算,而汇编语言中是定义子程序的功能,在主程序中调用这些功能进行 运算。之后,我们开始尝试写代码,但仍然是参考网上的一些实例来进行。首先,数据段的定义:data segme ntin data dw 2 dupoutdata dw 1 dup

5、notein1 db 'please in put the first decimal nu mber(0-99):$'notein2 db 'please in put the sec ond decimal nu mber(0-99):$'noteout db 'the result of addition is:$'no tewar n db 'warni ng:wro ng char!$'no teaga in db 'please in put aga in:$'data endsshow macro a

6、ddrmov ah,9hlea dx,addrint 21hendm这部分定义了在屏幕上现实的提示和输入数值的位数。值得一提的是宏定义 这一部分:show为宏名,之后的三行代码是对 9号功能的调用,即显示以$结尾 的字符串,经此定义后,就可以在源程序中调用宏,只需在需要复制宏体的地方 写宏的名字show即可。以上部分为第二次的实验过程,最终的程序没有写出来,但还是有一些收获 的。第一,是将这个运算的基本过程理解了,特别是对于主程序调用子程序的方式有了更深一步的认识,将其类比到 C+语言中更有利于学习,所以各种编程语 言应该都是有相通之处的。第二,了解了宏指令的定义和调用,老师课上是讲解 过的,

7、但当时没有特别注意,现在自己写代码时才意识到这个问题。第三,自己 写代码时才注意到基础知识的不牢固,通过这一过程巩固一下基本知识也算一个收获吧。第三次实验课,老师把完整的代码展示给我们并仔细的讲解了一遍。经过老 师的讲解,我们对整个运算过程都有了比较清晰的理解,但再一次自己动手的时候又陷入昨天一样的困境,无从下手,只得根据网上的实例和老师的代码将过程 基本还原,第二部分代码如下:code segme ntassume cs:code,ds:data,es:datamai n proc farstart:push dssub ax,axpush axmov ax,datamov ds,axmov

8、 es,axshow noteinlcall crlfcall deci_i nputmov in data,bxcall crlfshow notein2call crlfcall deci_i nputmov in data+2,bxcall crlfmov ax,bxadd ax,i ndatamov outdata,axshow no teoutcall crlfcall deci_outputretmain endp首先前面一部分是汇编语言的基本框架,show notein1 ,show notein2 ,show noteout 是通过调用宏来显示之前定义过的字符串。deci_in

9、put ,deci_output为两个子程序,通过call来调用运行。mov, add等指令进行数据的传送和算术 计算在这段代码中有这样两条语句: mov indata,bx 和mov indata+2,bx,在数据定 义中定义的是两个字变量来存放输入的数值,in data表示的是首地址,即第一 个变量存放处,indata+2表示第二个变量存放处,2是偏移量。接下来是子程序:deci_i nput proc n earmov bx,0n ewchar:mov ah,1int 21hcmp al,Odhjz exitsub al,30hjl no teerrcmp al,9djg no teer

10、rcbwxchg ax,bxmov cx,10dmul cxxchg ax,bxadd bx,axjmp n ewcharno teerr:call crlfshow no tewar ncall crlfshow no teaga injmp n ewcharexit: retdeci_i nput endp这段子程序将键盘上输入的ASCII转换为十进制数并将其存放在寄存器中, 在其中也对数值的位数进行了限制,限定于两位数。由于输入两个数的过程是一样的,所以其实就是进行了一次循环,两次调用的子程序都是一样的。两数相加 的过程在主程序中完成,得到的结果存于相应寄存器,接下来的工作就是将其显 示

11、出来,用下面这段子程序:deci_output proc n earmov bx,outdatamov cl,100dmov ax,bxdiv clmov bl,ahmov dl,aladd dl,30hcall dispcharmov ax,0mov al,blcbwmov cl,10ddiv clmov bl,ahmov dl,aladd dl,30hcall dispcharmov dl,bladd dl,30hcall dispcharretdeci_output endp这就是整个运算的基本过程。第三次实验课主要是对于程序内部具体执行的 一些细节的理解,对数据传送与储存,数值的转换过

12、程都认识的更加深刻了一些。第四次实验课,经过大家共同的讨论和分析,所得代码已经能够正常编译并 且运行。在这个过程中十分遗憾的是没有自己独立的写出这个程序的代码,基本上是按照网上的实例和老师的代码完成的,这充分说明自己距离独立编写程序还有一大段差距,需要做的努力还有很多。三. 总结与收获这次实验没有真正独立写出代码,完成任务是很大的遗憾。在这个过我也 总结了以下一些收获与不足:1. 对于基础知识的掌握不足,如寻址方式,指令系统等等,都没有充分理解 其意义,反应在编程过程中就是无从下手, 不知该写什么。其实编程的过程也是 一个回顾知识的过程,这个过程对理解寻址方式等知识有很大的帮助。2. 程序的调

13、用是汇编程序中一个重要的部分,可以类比函数的调用,虽然有 很大的区别,但这种思想应该是共通的。不同的功能用不同的子程序来完成,使 得思路和过程会比较清晰。3. 编程不是上来就敲代码,那样谁都写不出来,首先要充分的分析问题,改 用怎样的思路解决,要分几步完成,每一步的步骤和作用又都是什么, 这些问题 是在写代码之前都要想清楚的,绝不可能一边写一遍去想过程,那样没有明确思 路会越写越乱。4. 老师也说过,编程就是一道坎,迈过去就会发现其实也并不是那么困难,但在迈的这个过程中是需要付出极大的努力,自己多写多练,代码不是看出来的而是自己写出来的,勤加练习才会有所收获。以上是我的一点感受和收获,不只是编

14、程,任何一种技能都是要勤奋练习才 有所得的。在此,也要感谢老师的帮助和辛勤指导。四. 附录完整的程序代码如下:data segme ntin data dw 2 dup(?) outdata dw 1 dup(?) notein1 db 'please in put the first decimal nu mber(0-99):$' notein2 db 'please in put the sec ond decimal nu mber(0-99):$' noteout db 'the result of addition is:$' no

15、tewar n db 'warni ng:wro ng char!$'no teaga in db 'please in put aga in:$'data endsshow macro addrmov ah,9h lea dx,addr int 21h endm code segme ntassume cs:code,ds:data,es:data mai n proc farstart: push ds sub ax,ax push ax mov ax,data mov ds,ax mov es,ax show notein1 call crlf call

16、deci_i nput mov in data,bx call crlf show notein2 call crlf call deci_i nput mov in data+2,bx call crlf mov ax,bx add ax,i ndata mov outdata,ax show no teout call crlf call deci_output ret main endpdeci_i nput proc n ear mov bx,0n ewchar:mov ah,1 int 21h cmp al,0dh jz exit sub al,30h jl no teerr cmp

17、 al,9djg no teerrcbw xchg ax,bx mov cx,10d mul cx xchg ax,bx add bx,ax jmp n ewchar no teerr:call crlf show no tewar n call crlf show no teaga in jmp n ewchar exit: ret deci_i nput endp 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,

温馨提示

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

评论

0/150

提交评论