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

付费下载

下载本文档

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

文档简介

电子科技大学计算机学院实验中心实用文档计算机专业类课程实验报告课程名称:汇编程序语言设计学院:计算机科学与工程专业:计算机科学与技术学生姓名:林怡学号:2012060020023指导教师:胡建日期:2014年12月15日

电子科技大学实验报告实验一实验名称:汇编源程序的上机调试操作基础训练实验学时:4实验内容和目的:实验内容:1.DEBUG命令的使用2.程序的调试与运行3.编写程序计算以下表达式:Z=(5X+2Y-7)/2设X、Y的值放在字节变量VARX、VARY中,结果存放在字节单元VARZ中。实验目的:1.掌握DEBUG的基本命令及其功能2.学习数据传送和算术运算指令的用法3.熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。实验原理:1.编辑源程序,建立一个以后缀为.ASM的文件.2.汇编源程序,检查程序有否错误,有错时回到编辑状态,修改程序中错误行。无错时继续第3步。3.连接目标程序,产生可执行程序。4.用DEBUG程序调试可执行程序,记录数据段的内容。实验器材(设备、元器件)pc、window7平台、masm5开发环境实验步骤:在数据段中分别用两个单元varx和vary存放变量x和y;另一个单元varz用来存放运算结果Z;由于是字节变量,所以用al存放变量x的值,然后将al左移两位得到4*x,再把al加上x,进而得到5*x;再用bl存放变量y的值,用add命令得到2*y,之后把al与bl相加,再用sub命令减去7,得到(5*x+2*y-7)的值,并保存到al中;最后将al右移一位,得到最后的z=(5*x+2*y-7)/2,并把al的值送入varz单元;运行程序,使用-d命令查看内存单元的信息;实验数据及结果分析:实验代码如下:实验结果如下图:编译连接后执行程序:查看内存单元变量的值varx=05h,vary=07h,(5x+2y-7)/2=(25d+14d-7d)/2d=16d=10h可以看到上图中内存单元的值与手工计算的结果相符,说明程序是正确的。实验结论、心得体会和改进建议:本次实验让我掌握debug调试软件的一些基本命令,也学会了如何查看寄存器变量和内存单元;这个程序虽然短小,却是五脏俱全,让我对于一个完整汇编程序的框架有了一个基本的了解,为后面的更为复杂的实验奠定了基础;

电子科技大学实验报告实验二实验名称:分支程序与循环程序设计实验学时:4实验内容和目的:实验内容:根据输入的字母进行大小写转换(若是输入小写字母则转换成为大写字母,反之),若输入的不是字母则提示出错并重新输入。实验目的:1.掌握分支程序的结构。2.掌握分支程序的设计与调试方法。3.掌握循环程序设计与调试方法4.掌握正确分配与使用寄存器。实验原理:利用软中断指令,进行人机交互,输入字母并显示转换后的字母;由ascii码表可知,小写字母与其对应的大写字母之间刚好相差20h,即若输入的是大写字母,将其加上20h就可以得到对应的小写字母,反之小写字母减去20h可以得到其大写字母;利用CMP比较指令对输入的字母判定大小写,在根据标志寄存器的状态执行条件转移指令找到对应的程序段入口;实验器材(设备、元器件)pc、window7平台、masm5开发环境实验步骤:1、根据程序流程图编写源程序文件;2、汇编,若发现语法错误或者格式错误则修改;开始3、链接,形成可执行文件;开始4、运行程序,单步执行查看寄存器标量及内存单元;5、验证程序的正确性;从键盘输入字符并存入al只程序流程图如右图:从键盘输入字符并存入al只YESal<YESal<41h打印错误信息NONO打印错误信息NONOal>5ahal>5ahYESYESal<61hYESYESal<61hNOYESNOYESal加上20h把小写字母转换为大写字母NOal>71hal加上20h把小写字母转换为大写字母NOal>71hal减去20h把大写字母转换为小写字母al减去20h把大写字母转换为小写字母输出转换后的字母输出转换后的字母结束结束实验数据及结果分析:实验代码如下:实验结果如图:编译连接以及调试:输入小写p输出大写P输入小写t输出大写T输入非字母的字符输出警告信息并重新输入一个字符(大写的Q)八、实验结论、心得体会和改进建议:本实验也有其他的做法,由观察可知,小写字母的8位二进制数的第5位(从第0位开始数)上的值一定为1,而大写字母的第五位一定为0,所以也可以对将小写字母与11011111B做and运算,把第五位上的1置0从而转换为大写字母,而大写字母与0010000B做or运算,把第五位上的0置为1变为小写字母。电子科技大学实验报告实验三实验名称:数制、码制和子程序的编程与调试实验学时:4实验内容和目的:实验内容:从键盘输入两个2位十六进制数,相加,结果以十进制形式显示在屏幕上。(要求结果显示完整的算式)实验目的:1.、熟练掌握编写汇编语言原程序的基本方法和基本框架。2、熟练使用DEBUG调试程序。3.、掌握十六进制数与ASCII码之间,ASCII码与BCD码之间的转换。4.、掌握用DOS功能调用,实现字符的输入和显示。5.、掌握子程序的编程与调试方法。实验原理:调用0ah号功能,从键盘输入两个2位十六进制数,并存入指定缓冲区;根据ascii码表的规律将十六进制数转换为二进制数,其中对于数字型ascii码取其低四位,而字母型的ascii码先减去07h后,再取低四位;而把二进制数转换为十进制数可以采用除基取余法,但要注意取出的余数是从低位往高位排列的。实验器材(设备、元器件)pc、window7平台、masm5开发环境实验步骤:asc2bin根据程序流程图编写实验代码;asc2bin2、汇编,若发现语法错误或者格式错误则修改;将使用到的寄存器压栈3、链接,形成可执行文件;将使用到的寄存器压栈将ch赋值为24、运行程序,单步执行查看寄存器标量及内存单元;将ch赋值为25、验证程序的正确性流程图如下:开始YES按顺序取一个ascii码到bl中bin2deccc开始YES按顺序取一个ascii码到bl中bin2decccNObl<’0’将使用到的寄存器压栈输出提示信息并输入第一个16进制数存入ascbuf1单元NObl<’0’将使用到的寄存器压栈输出提示信息并输入第一个16进制数存入ascbuf1单元输出错误信息YESbl<=9将两数之和存放到al中,基数10放入bl输出提示信息并输入第二个16进制数存入ascbuf2单元输出错误信息YESbl<=9将两数之和存放到al中,基数10放入bl输出提示信息并输入第二个16进制数存入ascbuf2单元NO将ax高8位清零,保留其低8位的值调用子程序asc2bin把第一个数转换为8位二进制数NO将ax高8位清零,保留其低8位的值调用子程序asc2bin把第一个数转换为8位二进制数YES将bl高四位清零ax除以bl的值,把余数存入equal单元对应位置调用子程序asc2bin把第二个数转换为8位二进制数两个8位二进制数相加并将结果暂存入sum缓冲单元调用bin2dec子程序把二进制数的和转换成十进制数把ascbuf1和ascbuf2中的数存入equa1单元对应位置把十进制数转换为ascii码再存入equa1单元对应位置YES将bl高四位清零ax除以bl的值,把余数存入equal单元对应位置调用子程序asc2bin把第二个数转换为8位二进制数两个8位二进制数相加并将结果暂存入sum缓冲单元调用bin2dec子程序把二进制数的和转换成十进制数把ascbuf1和ascbuf2中的数存入equa1单元对应位置把十进制数转换为ascii码再存入equa1单元对应位置al左移四位bl<’A’NO商al=0?al左移四位bl<’A’NO商al=0?ch减1oral,blbl<=’F’把寄存器出栈YESch减1oral,blbl<=’F’把寄存器出栈YESNOch=0??NOYES返回NOch=0??NOYES返回YESbl减去07hYESbl<’a’YESbl减去07hYESbl<’a’movbinbuf,alNObl<=’fmovbinbuf,alNObl<=’f’返回寄存器出栈结束输出完整算式返回寄存器出栈结束输出完整算式实验数据及结果分析:实验代码如下:程序运行结果图如下:由上图可以看出,63H=99D,2CH=44D,99D+44D=143D,可见结果是正确的。单步执行结果如下图:输入第一个十六进制数:输入第二个十六进制数:调用子程序acs2bin:(由于篇幅有限,只截部分图示意)4、将两数之和转换为十进制数,调用bin2dec子程序(程序中笔误写成了bin2hex)5、将十进制数转换为ascii码,显示完整算式6、执行程序过程中发现,当输入的字符不在0-9A-Za-z区间时,程序并没有如想象中的打印出错误信息,而是直接回到了dos操作界面,这一点我十分不明白,如下图所示:实验结论、心得体会和改进建议:如上面提到的,执行程序过程中发现错误提示信息打印不了,在网上也是没有找到答案,后来我想了想是不是在子程序中就不能再进行软中断了呢?子程序调用和软中断都会对现场进行压栈保护,可能两者之间有所冲突。实验过程中,在把二进制数转换为十进制数时,一开始我是把每次除以10求得的余数按正序存放的,这样得到的十进制数就正好是倒序的,后来发现了错误,及时改正了。电子科技大学实验报告实验四实验名称:串操作指令及其应用程序的设计与调试运行实验学时:4实验内容和目的:实验内容:从键盘输入两个相同长度的字符串,分别放到数据段和附加段,利用串比较指令比较数据段和附加段中两个字符串,如果两串一样,输出Y,否则输出不同的字符。实验目的:1.熟悉串操作指令的基本格式和使用方法。2.掌握常用的串操作程序的设计方法。3.熟悉串操作程序的调试运行过程。实验原理:1、需要用到9号DOS功能调用显示字符串,以实现人机对话。比如:在数据段中设置两个存放提示信息的字符串,一个是提示用户输入,另一个是指示显示结果:massage1DB‘pleaseinputastring:’,0AH,0DH,‘$’2、需要用到10号DOS功能调用输入连续的字符串,并为这些字串预留存储空间,比如:STRING1DB20,0,20DUP(‘0‘),0AH,0DH,‘$’利用串比较指令CMPSB比较两个字符串的对应字符是否相等,同时使用REPE重复执行指令再配合JNZ和JMP等转移指令来控制程序的循环和跳转;实验器材(设备、元器件)pc、window7平台、masm5开发环境实验步骤:1、根据程序流程图编写实验代码;开始输出提示信息并输入第一个字符串存入数据段str1单元输出提示信息并输入第二个字符串存入扩展段str2单元分别使si和di指向两个字符串的第一个字符开始输出提示信息并输入第一个字符串存入数据段str1单元输出提示信息并输入第二个字符串存入扩展段str2单元分别使si和di指向两个字符串的第一个字符3、链接,形成可执行文件;4、运行程序,单步执行查看寄存器标量及内存单元;5、验证程序的正确性;程序流程图如右图所示:将df标志位清零将df标志位清零将cx赋值为字符串的长度将cx赋值为字符串的长度YESREPZCMPSBYESREPZCMPSBNOZF=0&&cx≠0?NOZF=0&&cx≠0?NOZF≠0?NOZF≠0?字符串相等输出’Y’输出不相等的字符YES字符串相等输出’Y’输出不相等的字符YESREPZCMPSBREPZCMPSBYESZF≠0?YESZF≠0?结束NO结束NO实验数据及结果分析:实验代码如下:实验结果如下图:下面是单步执行结果:输入第一个字符串str1输入第二个字符串str2串操作指令CMPSB,当两个字符不等时,跳转打印不同的字母,然后继续进行串比较对于这一部分,看图可以注意到我手动的添加了一个CMPCX,0指令,当CX≠0时才继续执行CMPSB指令,这是由于在之前的代码调试过程中,我发现当我不对cx进行手动的判0时,REPZCMPSB指令将会永远执行下去,即使此时CX的值已经等于0000了,如下图所示:继续输出不相同的字符,并且此时CX=0000程序运行完毕实验结论、心得体会和改进建议:通过这次试验,我熟练的掌握了串比较指令CMPSB以及重复前缀

温馨提示

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

评论

0/150

提交评论