《汇编语言实验报告(共42页).doc》由会员分享,可在线阅读,更多相关《汇编语言实验报告(共42页).doc(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上计算机专业类课程实验报告课程名称:汇编程序语言设计学院:计算机科学与工程专业:计算机科学与技术学生姓名:林怡学号:23指导教师:胡建日期:2014年12月15日电 子 科 技 大 学实 验 报 告实验一一、 实验名称:汇编源程序的上机调试操作基础训练二、 实验学时:4三、 实验内容和目的:实验内容:1. DEBUG命令的使用 2. 程序的调试与运行 3.编写程序计算以下表达式: Z=(5X+2Y-7)/2设X、Y的值放在字节变量VARX、VARY中,结果存放在字节单元VARZ中。实验目的:1. 掌握DEBUG 的基本命令及其功能2. 学习数据传送和算术运算指令的用法3
2、. 熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。四、 实验原理:1编辑源程序,建立一个以后缀为 .ASM的文件.2汇编源程序,检查程序有否错误,有错时回到编辑状态,修改程序中错误行。无错时继续第3步。3连接目标程序,产生可执行程序。4用DEBUG程序调试可执行程序,记录数据段的内容。 五、 实验器材(设备、元器件)pc、window7平台、masm5 开发环境六、 实验步骤:1、 在数据段中分别用两个单元varx和vary存放变量x和y;另一个单元varz用来存放运算结果Z;2、 由于是字节变量,所以用al存放变量x的值,然后将al左移两位得到4*x,再把al加上x,进而得到
3、5*x;3、 再用bl存放变量y的值,用add命令得到2*y,之后把al与bl相加,再用sub命令减去7,得到(5*x+2*y-7)的值,并保存到al中;4、 最后将al右移一位,得到最后的z=(5*x+2*y-7)/2,并把al的值送入varz单元;5、 运行程序,使用-d命令查看内存单元的信息;七、 实验数据及结果分析:实验代码如下:实验结果如下图:1、 编译连接后执行程序:2、 查看内存单元变量的值varx =05h,vary=07h, (5x+2y-7)/2=(25d+14d-7d)/2d=16d=10h可以看到上图中内存单元的值与手工计算的结果相符,说明程序是正确的。八、 实验结论、
4、心得体会和改进建议:1、 本次实验让我掌握debug调试软件的一些基本命令,也学会了如何查看寄存器变量和内存单元;2、 这个程序虽然短小,却是五脏俱全,让我对于一个完整汇编程序的框架有了一个基本的了解,为后面的更为复杂的实验奠定了基础;电 子 科 技 大 学实 验 报 告实验二一、 实验名称:分支程序与循环程序设计二、 实验学时:4三、 实验内容和目的:实验内容:根据输入的字母进行大小写转换(若是输入小写字母则转换成为大写字母,反之),若输入的不是字母则提示出错并重新输入。实验目的: 1.掌握分支程序的结构。 2.掌握分支程序的设计与调试方法。 3.掌握循环程序设计与调试方法 4.掌握正确分配
5、与使用寄存器。四、 实验原理:1、 利用软中断指令,进行人机交互,输入字母并显示转换后的字母;2、 由ascii码表可知,小写字母与其对应的大写字母之间刚好相差20h,即若输入的是大写字母,将其加上20h就可以得到对应的小写字母,反之小写字母减去20h可以得到其大写字母;3、 利用CMP比较指令对输入的字母判定大小写,在根据标志寄存器的状态执行条件转移指令找到对应的程序段入口;五、 实验器材(设备、元器件)pc、window7平台、masm5 开发环境六、 实验步骤:1、根据程序流程图编写源程序文件;2、汇编,若发现语法错误或者格式错误则修改; 开始3、链接,形成可执行文件;4、运行程序,单步
6、执行查看寄存器标量及内存单元;5、验证程序的正确性;从键盘输入字符并存入al只程序流程图如右图: YESal5ahYESYESal71hal减去20h把大写字母转换为小写字母输出转换后的字母结束七、 实验数据及结果分析:实验代码如下:实验结果如图:1、 编译连接以及调试:2、 输入小写p3、 输出大写P4、 输入小写t5、 输出大写T6、 输入非字母的字符7、 输出警告信息并重新输入一个字符(大写的Q)八、实验结论、心得体会和改进建议:本实验也有其他的做法,由观察可知,小写字母的8位二进制数的第5位(从第0位开始数)上的值一定为1,而大写字母的第五位一定为0,所以也可以对将小写字母与B做and
7、运算,把第五位上的1置0从而转换为大写字母,而大写字母与B做or运算,把第五位上的0置为1变为小写字母。电 子 科 技 大 学实 验 报 告实验三一、 实验名称:数制、码制和子程序的编程与调试二、 实验学时:4三、 实验内容和目的:实验内容:从键盘输入两个2位十六进制数,相加,结果以十进制形式显示在屏幕上。 (要求结果显示完整的算式)实验目的:1.、熟练掌握编写汇编语言原程序的基本方法和基本框架。2、熟练使用DEBUG调试程序。3.、掌握十六进制数与ASCII码之间,ASCII码与BCD码之间的转换。4.、掌握用DOS功能调用,实现字符的输入和显示。5.、掌握子程序的编程与调试方法。四、 实验
8、原理:1、 调用0ah号功能,从键盘输入两个2位十六进制数,并存入指定缓冲区;2、 根据ascii码表的规律将十六进制数转换为二进制数,其中对于数字型ascii码取其低四位,而字母型的ascii码先减去07h后,再取低四位;3、 而把二进制数转换为十进制数可以采用除基取余法,但要注意取出的余数是从低位往高位排列的。五、 实验器材(设备、元器件)pc、window7平台、masm5 开发环境六、 实验步骤:asc2bin1、 根据程序流程图编写实验代码;2、汇编,若发现语法错误或者格式错误则修改;将使用到的寄存器压栈3、链接,形成可执行文件;将ch赋值为24、运行程序,单步执行查看寄存器标量及内
9、存单元; 5、验证程序的正确性 流程图如下: 开始YES按顺序取一个ascii码到bl中bin2decccNObl0将使用到的寄存器压栈输出提示信息并输入第一个16进制数存入ascbuf1单元输出错误信息YESbl=9将两数之和存放到al中,基数10放入bl输出提示信息并输入第二个16进制数存入ascbuf2单元NO将ax高8位清零,保留其低8位的值调用子程序asc2bin把第一个数转换为8位二进制数YES将bl高四位清零ax除以bl的值,把余数存入equal单元对应位置调用子程序asc2bin把第二个数转换为8位二进制数两个8位二进制数相加并将结果暂存入sum缓冲单元调用bin2dec子程序
10、把二进制数的和转换成十进制数把ascbuf1和ascbuf2 中的数存入equa1单元对应位置把十进制数转换为ascii码再存入equa1单元对应位置al左移四位 blANO商al=0?ch减1or al,blbl=F把寄存器出栈YES NOch=0?NOYES返回YESbl减去07hYESblamov binbuf,alNObl=f返回寄存器出栈结束输出完整算式七、 实验数据及结果分析:实验代码如下:程序运行结果图如下:由上图可以看出,63H=99D,2CH=44D,99D+44D=143D,可见结果是正确的。单步执行结果如下图:1、 输入第一个十六进制数:2、 输入第二个十六进制数:3、
11、调用子程序acs2bin:(由于篇幅有限,只截部分图示意)4、将两数之和转换为十进制数,调用bin2dec子程序(程序中笔误写成了bin2hex)5、将十进制数转换为ascii码,显示完整算式6、执行程序过程中发现,当输入的字符不在0-9A-Za-z区间时,程序并没有如想象中的打印出错误信息,而是直接回到了dos操作界面,这一点我十分不明白,如下图所示:八、 实验结论、心得体会和改进建议:1、 如上面提到的,执行程序过程中发现错误提示信息打印不了,在网上也是没有找到答案,后来我想了想是不是在子程序中就不能再进行软中断了呢?子程序调用和软中断都会对现场进行压栈保护,可能两者之间有所冲突。2、 实
12、验过程中,在把二进制数转换为十进制数时,一开始我是把每次除以10求得的余数按正序存放的,这样得到的十进制数就正好是倒序的,后来发现了错误,及时改正了。电 子 科 技 大 学实 验 报 告实验四一、 实验名称:串操作指令及其应用程序的设计与调试运行二、 实验学时:4三、 实验内容和目的:实验内容: 从键盘输入两个相同长度的字符串,分别放到数据段和附加段,利用串比较指令比较数据段和附加段中两个字符串,如果两串一样,输出Y,否则输出不同的字符。实验目的: 1熟悉串操作指令的基本格式和使用方法。 2掌握常用的串操作程序的设计方法。 3熟悉串操作程序的调试运行过程。 四、 实验原理:1、需要用到9号DO
13、S功能调用显示字符串,以实现人机对话。比如:在数据段中设置两个存放提示信息的字符串,一个是提示用户输入,另一个是指示显示结果:massage1 DB please input a string:, 0AH, 0DH, $2、需要用到10号DOS功能调用输入连续的字符串,并为这些字串预留存储空间,比如:STRING1 DB 20, 0, 20 DUP( 0), 0AH, 0DH, $3、 利用串比较指令CMPSB比较两个字符串的对应字符是否相等,同时使用REPE重复执行指令再配合JNZ和JMP等转移指令来控制程序的循环和跳转;五、 实验器材(设备、元器件)pc、window7平台、masm5 开
14、发环境六、 实验步骤:1、根据程序流程图编写实验代码; 开始输出提示信息并输入第一个字符串存入数据段str1单元输出提示信息并输入第二个字符串存入扩展段str2单元分别使si和di指向两个字符串的第一个字符2、汇编,若发现语法错误或者格式错误则修改;3、链接,形成可执行文件;4、运行程序,单步执行查看寄存器标量及内存单元;5、验证程序的正确性; 程序流程图如右图所示:将df标志位清零将cx赋值为字符串的长度YESREPZ CMPSBNOZF=0&cx0?NOZF0?字符串相等输出Y输出不相等的字符YESREPZ CMPSBYESZF0?结束NO七、 实验数据及结果分析:实验代码如下:实验结果如
15、下图:下面是单步执行结果:1、 输入第一个字符串str12、 输入第二个字符串str23、 串操作指令CMPSB,当两个字符不等时,跳转4、 打印不同的字母,然后继续进行串比较对于这一部分,看图可以注意到我手动的添加了一个CMP CX,0指令,当CX0时才继续执行CMPSB指令,这是由于在之前的代码调试过程中,我发现当我不对cx进行手动的判0时,REPZ CMPSB指令将会永远执行下去,即使此时CX的值已经等于0000了,如下图所示:5、 继续输出不相同的字符,并且此时CX=00006、 程序运行完毕八、 实验结论、心得体会和改进建议:1、 通过这次试验,我熟练的掌握了串比较指令CMPSB以及重复前缀指令REPZ/REPE的工作原理。通过单步执行并查看寄存器变量的值我更加深入的体会到了CMPSB指令的运行机制,以及它对于标志寄存器的影响; 2、然而,在这次试验中我还是有一些疑问没能得到解决,正如之前提到的,在对不相等字符进行处理时,我发现当输出一个不相等字符后,若此时CX=0000,再继续REPZ CMPSB指令时,该指令将永远执行下去,也就是说此时REPZ指令并没有对CX的值进行检查。我想了很久也没有想出原因,最后还是通过手动的对CX进行一个CMP操作来停止字符串的比较。 3、在输出不相等的字符时可以考虑将它们与原本在str2中的位置对齐。专心-专注-专业
限制150内