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