汇编语言 第08章 子程序设计.ppt
《汇编语言 第08章 子程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言 第08章 子程序设计.ppt(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言汇编语言 第第08章章 子程子程序设计序设计8.1 子程序的引出 在我们编写解决实际问题的程序时,往往会遇到多处使用相同功能的程序段,使用该程序段的唯一差别是对程序变量赋不同的值,例如计算:S=2X+3 3Y+150计算上述函数需要多次使用开方运算,如果每次用到开方运算就编写一段开方程序,那末开方程序在程序中会多次出现,不仅书写麻烦,容易出错,编辑、汇编它时,也会花费较多时间。同时,由于冗长,占用内存也较多。如果把多次使用的功能程序编制为一个独立的程序段,每当用到这种功能时,就将控制转向它,完成功能后再返回到原来的程序,这就会大大减少编程工作量。8.1 子程序的引出 使用子程序的好处使
2、用子程序的好处:(1)简化了程序设计过程,减少了工作量,节省了时间;(2)源程序缩短,节省了机器汇编源程序的时间和存储目标代码的存储空间;(3)增加了源程序的可读性,便于调试维护;(4)有利于程序模块化、结构化和自顶向下的程序设计;(5)子程序一旦编制成功,在开发研制各种软件时都可利用,大大缩短了软件的开发周期。8.1 子程序的引出 子程序设计需了解的问题:子程序设计需了解的问题:1.1.子程序的定义与调用子程序的定义与调用设计出可以完成相对独立功能的程序段,并对汇编程序提供必要的信息,使得对该程序段汇编之后,在需要时可以被其他主程序调用,这一过程称为子程序的定义。已定义的子程序在什么时候被执
3、行,执行多少次,都不是由子程序自身决定的。在主程序需要调用相应的子程序时,可以用调用子程序指令使得相应子程序被执行。2.2.主程序与子程序之间的调用与返回主程序与子程序之间的调用与返回在主程序需要利用子程序的执行来完成某种工作时,就可以使用调用子程序指令来调用相应的子程序;在子程序完成它应该完成的工作之后,应当用返回指令返回调用它的主程序。主程序主程序:CALL SUBR:子程序子程序SUBR:RET8.2 子程序(过程)定义伪指令子程序定义伪指令所定义的子程序的一般格式子程序定义伪指令所定义的子程序的一般格式:PN PROCNEAR/FAR ;说明过程开始 :;过程体 :PN ENDP ;说
4、明过程结束8.3 调用和返回指令1.1.调用分类调用分类(1)段内调用与段间调用(2)直接调用与间接调用2.调用指令 指令汇编格式指令汇编格式:CALL PROCNAMEREGNAMEMEMLABEL 操作:操作:(1)1)段内调用段内调用:SPSP-2 (SP+1,SP)IP IPOFFSET PROCNAME或REGNAME或(MEMLABEL)(2)(2)段间调用段间调用:SPSP-2 (SP+1,SP)CS CSSEG PROCNAME或(MEMLABEL+2,MEMLABEL+3)SPSP-2 (SP+1,SP)IP IPOFFSET PROCNAME或(MEMLABEL,MEMLA
5、BEL+1)受影响的寄存器受影响的寄存器:没有 3.返回指令指令汇编格式指令汇编格式:RET VAL操作操作:(1)(1)段内返回段内返回:IP(SP+1,SP)SPSP+2 SPSP+VAL(如果选用了VAL)(2)(2)段间返回:段间返回:IP(SP+1,SP)SPSP+2 CS(SP+1,SP)SPSP+2 SPSP+VAL(如果选用了VAL)受影响的寄存器:受影响的寄存器:没有8.4子程序设计方法8.4.1 现场的保护和恢复8.4.2 子程序说明文件8.4.3 主程序与子程序之间的参数传递8.4.1 现场的保护和恢复 子程序中需要使用的寄存器,有可能在主程序中正被用来保存某种中间结果,
6、这些寄存器的值在从子程序返回主程序后还要继续使用,这些寄存器的值或所需的标志位的值等信息称之为现场。显然,子程序执行前需要保护现场,返回时要恢复现场。保存现场与恢复现场的工作既可在调用程序中完成,也可在子程序中完成,程序设计时根据情况安排。如果子程序已经设计好了,而其中未保护主程序现场,那么调用程序在使用子程序之前应保护现场,从子程序返回后再恢复现场。通常在主程序中保护现场,则一定在主程序中恢复;在子程序中保护现场,则一定在子程序中恢复。这样可以增强主程序和子程序之间的相对独立性,减少相互依赖,使程序结构清楚,减少错误。8.4.1 现场的保护和恢复保护现场和恢复现场的方法:(1)利用压栈和出栈
7、指令,将寄存器内容或状态标志位内容保存在堆栈中,恢复时再从堆栈中取出。例子:SQROOT1 PROCSQROOT1 PROC NEAR NEAR PUSH AX PUSH AX;保存现场保存现场 PUSH BX PUSH BX PUSH CX PUSH CX .;子程序正常工作子程序正常工作 POP CX POP CX ;恢复现场恢复现场 POP BX POP BX POP AX POP AX RET RET SQROOT1 ENDP SQROOT1 ENDP (2)利用内存单元。用传送指令将寄存器的内容保存到指定的内存单元,恢复时再用传送指令取出。8.4.2子程序说明文件(1)(1)子程序名
8、子程序名(子程序入口地址):用过程(子程序)定义伪指令定义该过程(子程序)时的过程名,这时过程(子程序)中第一条语句必须是子程序的入口指令;否则应写子程序入口指令的标号或地址。(2)(2)子程序功能子程序功能:用自然语言或数学语言等形式简单清楚地描述子程序完成的任务。(3)(3)入口条件入口条件:说明子程序要求有几个入口参数,这些参数表示的意义及存放位置。(4)(4)出口条件出口条件:说明子程序有几个输出参数(运行结果),这些参数表示的意义、存放的位置。(5)(5)受影响的寄存器受影响的寄存器:说明子程序运行后,哪些寄存器的内容被破坏了,以便使用者在调用该子程序之前注意保护现场。8.4.2子程
9、序说明文件子程序说明文件例子:(1)子程序名:SQROOT1;(2)程序功能:求双字节整数的平方根的整数部分;(3)入口条件:被开方数放在DX中;(4)出口条件:平方根在DX中;(5)受影响的寄存器:AX,BX,CX,DX及标志寄存器F。8.4.3 主程序与子程序之间的参数传递 子程序运行时所需的加工对象应由调用程序提供,处理的结果应提供调用程序使用,二者之间要进行信息交换或者说相互之间要传递参数。常用的传送方法有四种:(1)约定寄存器法;(2)约定存储单元法;(3)堆栈法;(4)约定参数地址指针法。以计算下述函数为例,说明各种参数传送方法。例例8.18.1 编制程序计算:Z=2X+3Y+15
10、0设X,Y 为整数字数据,且存于PX和PY单元,计算结果存入RLT单元。1.约定寄存器法 约定寄存器法传送参数,即事先约定一些存放参数的通用寄存器,调用程序转向子程序时,先把要传送的参数放到约定好的寄存器中,子程序工作时,从约定的寄存器中取参数,然后把结果存入事先约定的寄存器中,调用程序再从约定的寄存器中取结果。这种方法是程序设计中最常用、最简单、最方便的方法,在传送参数不多的情况下都采用此方法。1.约定寄存器法 开平方子程序和调用程序,约定将被开平方数放在DX中,平方根也放在DX中,其结果求得平方根的整数部分。1:;*EXAM8.1.1S*1:;*EXAM8.1.1S*2:SQROOT12:
11、SQROOT1PROCPROCNEARNEAR3:3:XORXORAX,AXAX,AX;i0i04:4:ANDANDDX,DXDX,DX;测试被开方数测试被开方数5:5:JZJZSQRT2SQRT2;被开方数为被开方数为0 06:SQRT1:6:SQRT1:MOVMOVBX,AXBX,AX;形成奇数形成奇数7:7:SHLSHLBX,1BX,18:8:INCINCBXBX9:9:SUBSUBDX,BXDX,BX;被开方数减去奇数被开方数减去奇数10:10:JCJCSQRT2SQRT2;不够减不够减11:11:INCINCAXAX;够减够减,i i增增1 112:12:JMPJMPSQRT1SQR
12、T1;继续继续13:SQRT2:13:SQRT2:MOVMOVDX,AXDX,AX;DX;DX平方根平方根14:14:RETRET;返回返回15:SQROOT115:SQROOT1ENDPENDP1.约定寄存器法调用程序:调用程序:1:;*EXAM 8.1.1M*1:;*EXAM 8.1.1M*2:SSEGSEGMENT STACK 2:SSEGSEGMENT STACK 3:STKTOP DB 20 DUP(0)3:STKTOP DB 20 DUP(0)4:SSEG ENDS 4:SSEG ENDS 5:DSEG SEGMENT 5:DSEG SEGMENT 6:PX DW 12345 6:
13、PX DW 12345 7:PY DW 2469 7:PY DW 2469 8:RLT DW 0 8:RLT DW 0 9:DSEG ENDS 9:DSEG ENDS 10:CSEG SEGMENT 10:CSEG SEGMENT 11:ASSUME CS:CSEG,DS:DSEG 11:ASSUME CS:CSEG,DS:DSEG 12:ASSUME SS:SSEG 12:ASSUME SS:SSEG 13:MAIN1:MOV AX,DSEG 13:MAIN1:MOV AX,DSEG 14:MOV DS,AX 14:MOV DS,AX 15:MOV AX,SSEG 15:MOV AX,SSE
14、G 16:MOV SS,AX 16:MOV SS,AX 17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX;取取X X19:19:ADDADDDX,DXDX,DX;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY;取取Y Y23:23:MOVMOVAX,DXAX,DX;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX
15、,AXDX,AX26:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果35:35:MOV
16、MOVAH,4CHAH,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQRO
17、OT1SQROOT1ENDPENDP17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX;取取X X19:19:ADDADDDX,DXDX,DX;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY;取取Y Y23:23:MOVMOVAX,DXAX,DX;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26
18、:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果35:35:MOVMOVAH,4CHA
19、H,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1
20、ENDPENDP初始态(执行指令后)17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX;取取X X19:19:ADDADDDX,DXDX,DX;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY;取取Y Y23:23:MOVMOVAX,DXAX,DX;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26
21、:26:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果35:35:MOVMOVAH,4CHA
22、H,4CH36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1
23、ENDPENDP执行指令后17:MOV SP,SIZE STKTOP17:MOV SP,SIZE STKTOP18:18:MOVMOVDX,PXDX,PX;取取X X19:19:ADDADDDX,DXDX,DX;计算计算2X2X20:20:CALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序21:21:PUSHPUSHDXDX;暂存结果暂存结果2X2X22:22:MOVMOVDX,PYDX,PY;取取Y Y23:23:MOVMOVAX,DXAX,DX;计算计算3Y3Y24:24:ADDADDDX,DXDX,DX25:25:ADDADDDX,AXDX,AX26:26:C
24、ALLCALLSQROOT1SQROOT1;调用开平方子程序调用开平方子程序27:27:POPPOPAXAX;取出取出2X2X28:28:ADDADDAX,DXAX,DX;计算计算2X+2X+3Y3Y29:29:PUSHPUSHAXAX;暂存结果暂存结果30:30:MOVMOVDX,150DX,15031:31:CALLCALLSQROOT1SQROOT132:32:POPPOPAXAX;取出中间结果取出中间结果33:33:ADDADDAX,DXAX,DX;计算最终结果计算最终结果34:34:MOVMOVRLT,AXRLT,AX;保存结果保存结果35:35:MOVMOVAH,4CHAH,4CH
25、36:36:INTINT21H21H37:CSEG37:CSEG ENDSENDS38:38:ENDENDMAIN1MAIN1SQROOT1SQROOT1PROCPROCNEARNEARXORXORAX,AXAX,AXANDANDDX,DXDX,DXJZJZSQRT2SQRT2SQRT1:SQRT1:MOVMOVBX,AXBX,AXSHLSHLBX,1BX,1INCINCBXBXSUBSUBDX,BXDX,BXJCJCSQRT2SQRT2INCINCAXAXJMPJMPSQRT1SQRT1SQRT2:SQRT2:MOVMOVDX,AXDX,AXRETRETSQROOT1SQROOT1ENDPE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 第08章 子程序设计 08 子程序 设计
限制150内