汇编实验五子程序设计.doc
《汇编实验五子程序设计.doc》由会员分享,可在线阅读,更多相关《汇编实验五子程序设计.doc(17页珍藏版)》请在三一办公上搜索。
1、福建农林大学金山学院实验报告系: 专业: 计算机科学与技术 年级: 08 姓名: 学号: 实验课程: 汇编语言 实验室号:_ 实验设备号: 实验时间: 指导教师签字: 成绩: 实验五 子程序设计1实验目的和要求1、学习子程序的编写,主子程序的调用2、不同模块间程序的调用和调试2实验环境实验的硬件环境是:IBMPC机及其兼容机实验的软件环境是: 操作系统:DOS 2.0以上;调试程序:DEBUG.COM;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。3实验内容及实验
2、数据记录1、数据段中的3个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,观察IP的变化DATASEGMENTMAGDB ABCDATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATA MOVDS, AX MOVSI, 0 MOVCX, 3LL:MOV DL, MAGSICALL MADD INCSI LOOPLLMOVAH, 4CHINT21HMADDPROCMOV AH, 02H INT 21HRETMADDENDPCODEENDS END START2、阅读S31.ASM和S32.ASM两个模块中的程
3、序,并分别汇编,然后连接成一个可执行文件S31.EXE。具体步骤如下:MASM S31.ASM(分别汇编)MASM S32.ASMLINK S31 S32 (将两个文件连接成为一个文件名为S31)S31.EXE (运行)3、编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。(也可以将找到的不相等字符逐个显示,用INT 21H的02功能调用)4、编程:子程序搜索指定字符缓冲区中是否有n,如果有用y替代。调用子程序将BUF1,BUF2,BUF3中的n全部用y替代4算法描述及实验步骤1-1)文本编辑程序保存V1.asm,编译并连接后debug调试V1.
4、exe。跟踪如下u反汇编观察CALL指令所在程序段偏移量为000F而且Call到哪显而易见是0019即Mov AH,02与源程序一致而RET指令偏移量为001D但从中我们并不能得知其具体执行过程。1-2)t单步跟踪,图为执行CALL指令前各个寄存器的状态及查看SS:IP(d0769:0000)即栈顶内容为零。BP始终都为0实际上直到目前都没用到该堆栈。1-3)继续单步执行,此时IP指向下一条指令CALL 0019。即执行该指令,结果如下可看到SP变为了FFFE可知执行该指令的同时堆栈处于忙碌的变更中。之后IP直接指向CALL 所指0019。d0769:fffe查看栈顶内容如下高向低读为0012
5、由之前的反汇编得知0012正是INCSI指令的偏移量,而该指令位于Call指令的下一条。1-4)由此我们推断RET指令的作用就是弹出栈顶内容至IP来使得程序接着运行执行CALL指令后的程序。同样T单步执行观察如下很明显执行RET后IP指向了0012。SP又指向了栈底。得以证实了CALL调用子程序是通过堆栈保护了现场进入子程序,之后再通过RET恢复到了原状态2-1)单独阅读两个程序模块似乎毫无瓜葛,只知道S32.ASM模块中是实现的是二进制数转化为十六进制数并在显示器上显示的功能。S31.ASM实现的是通过子程序TRAN的调用完成对主程序着中获取的两位非压缩BCD数的二进制转化。按题目要求分别会
6、变S31.asm和S32.asm如下 2-2)分别编辑程序存为S31.asm和S32.asm文件。进入masm目录。汇编连接如下均正常通过。2-3)运行程序S31.exe结果如下等待输入两位字符:输入两个字符1和2立即就跟出了000C,输入字符4和5跟出了002D,程序实现了将2位非压缩BCD码转化为了16进制数并打印输出到显示器。可见diso子程序虽然在另一个程序段中但在主程序中还是能被CALL唯一和在同一段内 的调用方式不同的是需要指明是段内子程序,还是段外子程序。指令中的NEAR PTR或FARPTR正是此作用。 3-1)分析题目要求容易得知,程序可分为两部分,一是控制数据缓冲区的数据获
7、取,而自然就是数据处理了亦是题目要求中的子程序实现的功能。首先定义数据缓冲区有BUF1 DB MY NAME IS ZERO! LEN1 EQU $-BUF1 BUF2 DB YOU ARE MY GIRL,RIGHT? LEN2 EQU $-BUF2这里就有一个值得考虑的问题,就是缓冲区内的数据长度不等该怎么处理。对以等长直接下两指针即可方便循环控制。为方便起见,当然取短的不失为是好的选择,在与长的字符串中比较至短字符串长度LEN1结束并输出不等字符后指针DI所指向字符余下部分直接输出。因此有如下示意图:A输出A T输出B A输出D GTBACCDDIGSIBQ 输出BQ3-2)因而如何取较
8、短的一者作为循环条件及SI和DI的初始成了问题。比较可取的方法是先将LEN1假设为最短,传送给CX,同时将BUF1送AX,BUF2送BX。然后比较CX与LEN2,分支中处理数据交换。于是有MOV CX,LEN1 MOV AX,BUF1 MOV BX,BUF2 CMP CX,LEN2 JB L SUB CX,LEN1-LEN2 XCHG AX,BX L:MOV SI,AX MOV DI,BX问题得以解决。既然这样设计,则字符显示功能就应该分离出子程序另作为又一个子程序,方便主程序和比较字符的子程序的调用。3-3)于是有代码如下DATA SEGMENT BUF1 DB MY NAME IS ZER
9、O! LEN1 EQU $-BUF1;计算BUF1长度 BUF2 DB YOU ARE MY GIRL,RIGHT? LEN2 EQU $-BUF2;计算BUF2长度 DATAENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,LEN1;假设BUF1最短送入CX MOV AX,BUF1;AX存放短字符串首偏移/ MOV AX,OFFSET BUF1MOV BX,BUF2;BX存放长字符串首偏移/ MOV BX,OFFSET BUF2;MOV DH,LEN2-LEN1 ;下一个类似语句仅在分支中忽略
10、了LEN2大于LEN1CMP CX,LEN2 JB L SUB CX,LEN1-LEN2 MOV DX,CX ;暂时存放两字符串差/ MOV DH,CLXCHG AX,BX;LEN2较短则交换数据 L:MOV SI,AX;SI定位较短者 MOV DI,BX;DI定位较长者 S:CALL CMPP;调用子程序CMPP INC SI INC DI LOOP S;比较字符未完成继续 Y:INC DI ;应该移至Call后才正确MOV CX,DX ; MOV CL,DH并移至Y之前MOV AL,DI ;MOV DL,DICALL SHOW;较长字符串余下部分输出 CMPP PROC MOV AL,SI
11、 ;MOV DL,SICMP AL,DI ;CMP DL,DIJE SKIP CALL SHOW;字符不等调用子程序输出字符 MOV AL,DI ;MOV DL,DIINT 21H SKIP: RET CMPP ENDP SHOW PROC MOV AH,2;子程序调用dos的2号功能 INT 21H RET SHOW ENDP CODE ENDS END START4-1)要求子程序首先检索字符缓冲区内的N,并用Y替代。首先是各个缓冲区定义如下:DATA SEGMENT BUF1 DB MN name is ZERO! BUF2 DB NOU ARE MN GIRL,RIGHT? BUF3
12、DB no,you are MN Friend! LEN DB $DATAENDS4-2)由于各个缓冲区大小不一,所以各缓冲区大小的获取很重要,它将是每一轮循环的控制参数CX。可将它作为子程序的入口参数,来实现。而另一入口参数自然就是各缓冲区的首字符的偏移量SI。所以子程序实现:Displace PROC S:CMP SI,N JNE NEXT MOV SI,Y NEXT:INC SI LOOP S RET Displace NEDP4-3)主程序实现入口参数的初始化过程,所以有BUF1的实现,其它如是:MOV CX,BUF2-BUF1 ;一直犯同样的错误MOV SI,BUF1 ;CX初始化字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 实验 子程序 设计
链接地址:https://www.31ppt.com/p-2396842.html