第五章 子程序(精品).ppt
《第五章 子程序(精品).ppt》由会员分享,可在线阅读,更多相关《第五章 子程序(精品).ppt(156页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、新新新新 编编编编汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计1 1第五章第五章 子程序子程序 5.1子程序子程序5.2参数的传递参数的传递5.3嵌套和递归子程序嵌套和递归子程序5.4多模块程序设计多模块程序设计5.5汇编语言与汇编语言与C语言混合编程语言混合编程5.6DOS和和BIOS调用调用习题五习题五2 2子程序(子程序(Subroutine):把程序需要完成的任务分解为若干个把程序需要完成的任务分解为若干个“子任务子任务”,每个,每个“子任务子任务”由一段相对独立的程序完成,称为由一段相对独立的程序完成,称为“子程序子程序”。调用子程序的程序称为调用子程序的程序称为
2、“主程序主程序”或者或者“主调程序主调程序”。子程序也称为子程序也称为“过程过程”(Procedure),),在高级语言在高级语言里还称作里还称作“函数函数”(Function)。)。3 3子程序结构程序的优点子程序结构程序的优点:1.1.程序结构清晰,提高了程序的可阅读性和可维护性。程序结构清晰,提高了程序的可阅读性和可维护性。2.2.每个子程序可以独立地进行调试,由于程序规模较每个子程序可以独立地进行调试,由于程序规模较小,降低了调试难度。小,降低了调试难度。3.3.每个子程序就是一个具有特定功能的独立的程序,每个子程序就是一个具有特定功能的独立的程序,提高程序的提高程序的“可重用性可重用
3、性”,提高了软件开发效率。,提高了软件开发效率。4 4图图5-1子程序的调用和返回子程序的调用和返回5 5近程子程序近程子程序:只能被同一个代码段里的程序调用的子程序。只能被同一个代码段里的程序调用的子程序。由于主程序和子程序处于同一个代码段,调用和由于主程序和子程序处于同一个代码段,调用和返回时只需要改变返回时只需要改变IP寄存器的值,寄存器的值,CS寄存器的值寄存器的值保持不变。保持不变。近程子程序的入口地址用近程子程序的入口地址用16位段内偏移地址表示。位段内偏移地址表示。6 6远程子程序远程子程序:能够被不同代码段的程序调用,也能被同一代能够被不同代码段的程序调用,也能被同一代码段的程
4、序调用的子程序。码段的程序调用的子程序。调用这样的子程序时,需要同时改变调用这样的子程序时,需要同时改变CS和和IP寄寄存器的值,返回时,需要从堆栈里弹出存器的值,返回时,需要从堆栈里弹出32位的位的返回地址送入返回地址送入IP,CS寄存器。寄存器。远程子程序的入口地址用远程子程序的入口地址用16位段基址和位段基址和16位段位段内偏移地址表示。内偏移地址表示。子程序的类型在定义时说明子程序的类型在定义时说明7 75.15.1 子程序子程序 5.1.1 5.1.1 CALLCALL和和RETRET指令指令 5.1.2 5.1.2 子程序的定义子程序的定义 5.1.3 5.1.3 子程序文件子程序
5、文件 5.1.4 5.1.4 子程序应用子程序应用 8 8CALL(Call,调用)指令调用)指令段内直接调用段内直接调用格式:格式:CALL子程序名子程序名操作:操作:SPSP-2,SS:SPIP(保存保存16位返回地址)位返回地址)IP子程序入口的偏移地址子程序入口的偏移地址例如:例如:CALLPROC1段内间接调用段内间接调用格式:格式:CALLREG16/MEM16操作:操作:SPSP-2,SS:SPIP(保护保护16位返回地址)位返回地址)IPREG16/MEM165.1.1 5.1.1 CALL和和RET指令指令 9 9例如:调用名为例如:调用名为“PROC1”的近程子程序。的近程
6、子程序。(1)CALLPROC1(2)LEACX,PROC1CALLCX(3)ADDR_PROC1DWPROC1;子程序偏移地址放入存储器字变量子程序偏移地址放入存储器字变量CALL ADDR_PROC1;调用近程子程序调用近程子程序PROC1(4)LEABX,ADDR_PROC1CALL WORDPTRBX;调用近程子程序调用近程子程序PROC11010段间直接调用段间直接调用格式:格式:CALLFARPTR子程序名子程序名操作:操作:SPSP-2,SS:SPCSSPSP-2,SS:SPIP(保存保存32位返回地址,偏移地址保存在较小地址处)位返回地址,偏移地址保存在较小地址处)IP子程序入
7、口的偏移地址,子程序入口的偏移地址,CS子程序入口的段基址子程序入口的段基址CALLFARPTRPROC2例如:例如:1111段间间接调用段间间接调用格式:格式:CALL MEM32操作:操作:SPSP-2,SS:SPCSSPSP-2,SS:SPIPIPMEM32,CSMEM32+2例如:例如:ADD_PROC2DDPROC2;子程序入口地址放入存储器双字变量子程序入口地址放入存储器双字变量CALL ADD_PROC2;调用远程子程序调用远程子程序PROC21212无参数段内返回无参数段内返回格式:格式:RET操作:操作:IPSS:SP,SPSP+2有参数段内返回有参数段内返回格式:格式:RE
8、TD16操作:操作:IPSS:SP,SPSP+2SPSP+D16RET(Return,返回)指令返回)指令1313无参数段间返回无参数段间返回格式:格式:RET操作:操作:IPSS:SP,SPSP+2CSSS:SP,SPSP+2有参数段间返回有参数段间返回 格式:格式:RETD16操作:操作:IPSS:SP,SPSP+2CSSS:SP,SPSP+2SPSP+D1614145.1.2 5.1.2 子程序的定义子程序的定义 子程序名子程序名PROCNEAR/FAR子程序体子程序体子程序名子程序名ENDP1515 说明说明:子子程程序序名名应应为为合合法法的的标标识识符符,子子程程序序名名不不能能与
9、与同同一一个个源程序中的标号、变量名、其它子程序名相同。源程序中的标号、变量名、其它子程序名相同。方方括括号号中中的的内内容容是是子子程程序序的的远远近近属属性性选选项项,二二者者可可选选其一,如果缺省,默认为其一,如果缺省,默认为NEAR。用用NEAR说说明明的的子子程程序序是是“近近程程子子程程序序”,它它只只能能被被与它同一代码段的程序调用。与它同一代码段的程序调用。用用FAR说说明明的的子子程程序序是是“远远程程子子程程序序”,它它不不仅仅能能被被与与它它同同一一代代码码段段的的程程序序调调用用,也也能能被被其其它它代代码码段段的的程程序调用。序调用。子程序的定义要写在代码段内子程序的
10、定义要写在代码段内1616ZEROBYTESPROC;定义一个子程序定义一个子程序XOR AX,AX;AX清零清零MOV CX,128;循环次数送循环次数送CXZEROLOOP:MOV BX,AX;将将一一个个字字存存储储单单元清零元清零ADDBX,2;修改地址修改地址LOOPZEROLOOP;循环控制循环控制RET;返回主程序返回主程序ZEROBYTESENDP;子程序结束子程序结束思考题思考题:该子程序完成了什么功能?调用该子程序时,:该子程序完成了什么功能?调用该子程序时,应该先做什么准备工作?应该先做什么准备工作?1717ZEROBYTES:XORAX,AX;AX寄存器清零寄存器清零M
11、OV CX,128;计数器计数器CX置初值置初值ZEROLOOP:MOVBX,AX;一个字单元清零一个字单元清零ADDBX,2;修改地址指针,指向下一个字修改地址指针,指向下一个字LOOPZEROLOOP;循环控制循环控制RET;结束程序运行,返回主程序结束程序运行,返回主程序子程序也可以简单地写成下面的形式:子程序也可以简单地写成下面的形式:缺点:边界不容易清晰地区分;只能定义缺点:边界不容易清晰地区分;只能定义“近程子程序近程子程序”;只能被同一代码段内的程序调用只能被同一代码段内的程序调用。1818CODESEGMENT;代码段开始代码段开始MAINPROCFAR;主程序开始主程序开始;
12、主程序的指令序列主程序的指令序列MOV AX,4C00HINT21H;返回返回DOSMAINENDP;主程序结束主程序结束;其它程序其它程序CODEENDS;代码段结束代码段结束ENDMAIN;源程序结束源程序结束用户编写的用户编写的“主程序主程序”也可以看作是由操作系统调用的一个子程也可以看作是由操作系统调用的一个子程序:序:1919CODESEGMENT;代码段开始代码段开始MAINPROCFAR;主程序开始主程序开始PUSH DS;操作系统的返回点在操作系统的返回点在DS:0XOR AX,AXPUSH AX;把把32位返回点地址压入堆栈位返回点地址压入堆栈;主程序的指令序列主程序的指令序
13、列RET;返回返回DOSMAINENDP;主程序结束主程序结束;其它程序其它程序CODEENDS;代码段结束代码段结束ENDMAIN;源程序结束源程序结束还可以这样写:还可以这样写:2020例例5.1子程序子程序FRACTOR用来计算一个数的阶乘。主程序用来计算一个数的阶乘。主程序利用它计算利用它计算15的阶乘,存入的阶乘,存入FRA数组。数组。.386DATASEGMENTUSE16FRADW5DUP(?)DATAENDS2121CODESEGMENTUSE16ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AXMOV EBX,1;BX中存放待求阶乘的
14、数中存放待求阶乘的数MOV CX,5;求阶乘次数(循环次数)求阶乘次数(循环次数)LOOP0:CALLFRACTOR;调用调用FRACTOR求阶乘求阶乘MOV FRA2*EBX-2,AX;保存结果(阶乘)保存结果(阶乘)INCBX;产生下一个待求阶乘的数产生下一个待求阶乘的数LOOPLOOP0;循环控制循环控制MOVAX,4C00HINT21H2222FRACTORPROCNEARMOVCX,BX;待求阶乘的数转入待求阶乘的数转入;CX寄存器寄存器MOV AX,1;“累乘器累乘器”置初值置初值1FRALOOP:MUL CX;累乘累乘LOOPFRALOOP;循环控制循环控制RETFRACTORE
15、NDPCODEENDSENDSTART思考题:这个程序有问题,是什么问题?如何解决?思考题:这个程序有问题,是什么问题?如何解决?2323FRACTORPROCNEARPUSH CX;CX压入堆栈保护压入堆栈保护MOVCX,BX;待求阶乘的数转入待求阶乘的数转入CX寄存器寄存器MOV AX,1;“累乘器累乘器”置初值置初值1FRALOOP:MUL CX;累乘累乘LOOPFRALOOP;循环控制循环控制POPCX;从堆栈里弹出从堆栈里弹出CX的原值的原值RETFRACTORENDPCODEENDSENDSTART在子程序入口处把相关寄存器的值入栈保护,程序返回前在子程序入口处把相关寄存器的值入栈
16、保护,程序返回前再恢复它们的值,这个操作称为再恢复它们的值,这个操作称为“保护现场保护现场”和和“恢复现场恢复现场”。2424注意:上面的程序使用了上面的程序使用了32位寻址方式,连接时在位寻址方式,连接时在TLINK命令中要增加命令中要增加“/3”选择项:选择项:TLINK/3XXXXXX(XXXXXX为汇编得到的目标文件名)为汇编得到的目标文件名)2525子程序的基本格式:子程序的基本格式:子程序名子程序名PROCNEAR/FARPUSH;保护现场(寄存器保护现场(寄存器/存储器)存储器)PUSH;个数根据具体情况决定个数根据具体情况决定;子程序主体子程序主体POP;恢复现场,注意出栈次序
17、恢复现场,注意出栈次序POP;先进栈的寄存器后出栈先进栈的寄存器后出栈RET;返回返回子程序名子程序名ENDP26265.1.3 5.1.3 子程序文件子程序文件设计一个子程序之前,首先应该明确:设计一个子程序之前,首先应该明确:子程序的名字子程序的名字;子程序的功能子程序的功能;入入口口参参数数:为为了了运运行行这这个个子子程程序序,主主程程序序为为它它准准备备了了哪哪几几个个“已知条件已知条件”?这些参数存放在什么地方?这些参数存放在什么地方?出出口口参参数数:这这个个子子程程序序的的运运行行结结果果有有哪哪些些?存存放放在在什什么么地地方?方?影响寄存器影响寄存器:执行这个子程序会改变哪
18、几个寄存器的值?执行这个子程序会改变哪几个寄存器的值?其它需要说明的事项其它需要说明的事项。上述内容连同子程序源代码等合称为上述内容连同子程序源代码等合称为“子程序文件子程序文件”。常常把上述内容以常常把上述内容以“程序注释程序注释”的方式书写在一个子程的方式书写在一个子程序的首部。序的首部。2727;名称:名称:Square;功能:求功能:求16Bit无符号数的平方根无符号数的平方根;入口参数:入口参数:16Bit无符号数在无符号数在AX中中;出口参数:出口参数:8Bit平方根数在平方根数在AL中中;影响寄存器:影响寄存器:AX(AL)例如,一个名为例如,一个名为“SQUARE”的子程序,用
19、来求一个数的平方根的子程序,用来求一个数的平方根,源程序如下:源程序如下:2828SQUAREPROCNEARPUSH CX;保护现场保护现场PUSH BXMOV BX,AX;要求平方根的数送要求平方根的数送BXMOV AL,0;AL中存放平方根,初值中存放平方根,初值0MOV CX,1;CX置入第一个奇数置入第一个奇数1;利用公式:利用公式:N2=1+3+(2N-1)求平方根求平方根2929NEXT:SUBBX,CXJBDONEADDCX,2;形成下一个奇数形成下一个奇数INCAL;AL存放已减去奇数的个数存放已减去奇数的个数JMPNEXTDONE:POP BX;恢复现场恢复现场POPCXR
20、ET;返回返回SQUAREENDP课内练习:编写主程序,利用课内练习:编写主程序,利用SQUARE子程序,求数子程序,求数26的平方根,存放在变量的平方根,存放在变量ROOT中。中。30305.1.4 5.1.4 子程序应用子程序应用每调用一次子程序,主程序需要做三件事:每调用一次子程序,主程序需要做三件事:(1 1)为子程序准备入口参数)为子程序准备入口参数(2 2)调用子程序)调用子程序(3 3)处理子程序的返回参数)处理子程序的返回参数3131DATA SEGMENTX DW59,3500,139,199,77;欲求平方根的数组欲求平方根的数组ROOTDB5DUP(?);存放平方根内存区
21、存放平方根内存区DATA ENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX例,为了求,为了求5个无符号数的平方根,编制主程序如下:个无符号数的平方根,编制主程序如下:3232LEABX,X;初始化指针初始化指针LEASI,ROOTMOV CX,5;设置计数器初值设置计数器初值ONE:MOV AX,BX;设置入口参数设置入口参数CALL SQUARE;调用子程序调用子程序MOV SI,AL;保存返回参数(平方根)保存返回参数(平方根)ADDBX,2;修改指针修改指针INCSI;修改指针修改指针LOOPONE;循环控制循环
22、控制MOV AX,4C00H;返回返回DOSINT21H3333例例5.2从键盘上输入从键盘上输入10个十进制数,从中找出最个十进制数,从中找出最大的数,在屏幕上显示出来。大的数,在屏幕上显示出来。INCLUDEYLIB.H;声明外部函数声明外部函数.DATANUMDW10DUP(?)PROMPT1DB0AH,0DH,“InputaNumber:$”PROMPT2DB0AH,0DH,“TheMaximumNumberis:$”3434.CODESTART:MOVAX,DATAMOVDS,AXMOVCX,10LEABX,NUMNEXT:LEADX,PROMPT1;设置设置READINT子程序的入
23、口参数子程序的入口参数CALLREADINTMOVBX,AX;保存读入的十进制数保存读入的十进制数ADD BX,2LOOPNEXT3535LEABX,NUM;为子程序为子程序MAX准备入口参数准备入口参数MOV CX,10CALLMAX;MAX子程序找出子程序找出N个数中最大的数,并将此数从个数中最大的数,并将此数从AX返回返回LEADX,PROMPT2CALL WRITEINT;在屏幕上显示在屏幕上显示AX中的数中的数MOV AX,4C00HINT21H3636;子程序子程序MAX;功能:求若干个数中的最大值功能:求若干个数中的最大值;入入口口参参数数:BX=第第一一个个数数据据的的偏偏移移
24、地地址址,CX=数据个数数据个数;出口参数:最大值在出口参数:最大值在AX中中3737MAX PROCMOV AX,8000H;最小的最小的16位有符号数位有符号数AGAIN:CMPAX,BXJGESKIPMOV AX,BX;将当前最大数送将当前最大数送AXSKIP:INCBXINCBXLOOPAGAINRET;AX返回最大数返回最大数MAX ENDPENDSTART38385.25.2 参数的传递参数的传递 传递的参数有两种类型传递的参数有两种类型:(1 1)值值传传递递:把把参参数数的的值值放放在在约约定定的的寄寄存存器器或或存存储储单单元元传传递递 给给 子子 程程 序序,或或 者者,由
25、由 子子 程程 序序 返返 回回 给给 主主 程程 序序。如如果果一一个个入入口口参参数数是是用用值值传传递递的的,子子程程序序可可以以使使用用这这个个值,但是无法改变它自身的值。值,但是无法改变它自身的值。(2 2)地址传递地址传递:把参数事先存放在某个存储单元,把这个把参数事先存放在某个存储单元,把这个存储单元的地址作为参数传递给子程序。存储单元的地址作为参数传递给子程序。如果一个参数使用它的地址来传递,子程序可以改变这如果一个参数使用它的地址来传递,子程序可以改变这个参数的值。例如,把存放结果的存储单元的地址作为个参数的值。例如,把存放结果的存储单元的地址作为“入入口参数口参数”传递给子
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五章 子程序精品 第五 子程序 精品
限制150内