欢迎来到天天文库
浏览记录
ID:11200720
大小:154.50 KB
页数:14页
时间:2018-07-10
《汇编实验四--子程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、福建农林大学东方学院信息工程类实验报告系:计算机系专业:电子信息工程年级:10姓名:廖少冰学号:1050302103实验课程:汇编语言实验室号:_______实验设备号:实验时间:指导教师签字:成绩:实验四子程序设计1.实验目的和要求1、学习子程序的编写,主子程序的调用2、不同模块间程序的调用和调试2.实验用的软硬件环境实验的硬件环境是:IBM—PC机及其兼容机实验的软件环境是:操作系统:DOS2.0以上;调试程序:DEBUG.COM;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.E
2、XE(或ASM.EXE);连接装配程序:LINK.EXE;交叉引用程序:CREF.EXE(可有可无)。3.实验内容及实验数据记录1、数据段中的3个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,观察IP的变化DATASEGMENTMAGDB‘ABC’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVCX,3LL:MOVDL,MAG[SI]CALLMADDINCSILOOPLLMOVAH,
3、4CHINT21HMADDPROCMOVAH,02HINT21HRETMADDENDPCODEENDSENDSTART2、阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。具体步骤如下:MASMS31.ASM(分别汇编)MASMS32.ASMLINKS31S32(将两个文件连接成为一个文件名为S31)S31.EXE(运行)3、编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。(也可以将找到的不相等字符逐个显
4、示,用INT21H的02功能调用)4、编程:子程序搜索指定字符缓冲区中是否有n,如果有用y替代。调用子程序将BUF1,BUF2,BUF3中的n全部用y替代4.操作方法及实验步骤1-1)文本编辑程序保存V1.asm,编译并连接后debug调试V1.exe。跟踪如下u反汇编观察CALL指令所在程序段偏移量为000F而且Call到哪显而易见是0019即MovAH,02与源程序一致而RET指令偏移量为001D但从中我们并不能得知其具体执行过程。1-2)t单步跟踪,图为执行CALL指令前各个寄存器的状态及查看SS:I
5、P(d0769:0000)即栈顶内容为零。BP始终都为0实际上直到目前都没用到该堆栈。1-3)继续单步执行,此时IP指向下一条指令CALL0019。即执行该指令,结果如下可看到SP变为了FFFE可知执行该指令的同时堆栈处于忙碌的变更中。之后IP直接指向CALL所指0019。d0769:fffe查看栈顶内容如下高向低读为0012由之前的反汇编得知0012正是INCSI指令的偏移量,而该指令位于Call指令的下一条。1-4)由此我们推断RET指令的作用就是弹出栈顶内容至IP来使得程序接着运行执行CALL指令后的
6、程序。同样T单步执行观察如下很明显执行RET后IP指向了0012。SP又指向了栈底。得以证实了CALL调用子程序是通过堆栈保护了现场进入子程序,之后再通过RET恢复到了原状态2-1)单独阅读两个程序模块似乎毫无瓜葛,只知道S32.ASM模块中是实现的是二进制数转化为十六进制数并在显示器上显示的功能。S31.ASM实现的是通过子程序TRAN的调用完成对主程序着中获取的两位非压缩BCD数的二进制转化。按题目要求分别会变S31.asm和S32.asm如下2-2)分别编辑程序存为S31.asm和S32.asm文件。
7、进入masm目录。汇编连接如下均正常通过。2-3)运行程序S31.exe结果如下等待输入两位字符:输入两个字符1和2立即就跟出了000C,输入字符4和5跟出了002D,程序实现了将2位非压缩BCD码转化为了16进制数并打印输出到显示器。可见diso子程序虽然在另一个程序段中但在主程序中还是能被CALL唯一和在同一段内的调用方式不同的是需要指明是段内子程序,还是段外子程序。指令中的NEARPTR或FARPTR正是此作用。3-1)分析题目要求容易得知,程序可分为两部分,一是控制数据缓冲区的数据获取,而自然就是数
8、据处理了亦是题目要求中的子程序实现的功能。首先定义数据缓冲区有BUF1DB'MYNAMEISZERO!'LEN1EQU$-BUF1BUF2DB'YOUAREMYGIRL,RIGHT?'LEN2EQU$-BUF2这里就有一个值得考虑的问题,就是缓冲区内的数据长度不等该怎么处理。对以等长直接下两指针即可方便循环控制。为方便起见,当然取短的不失为是好的选择,在与长的字符串中比较至短字符串长度LEN1结束并输出不等字符后
此文档下载收益归作者所有