第六章子程序结构(精品).ppt
《第六章子程序结构(精品).ppt》由会员分享,可在线阅读,更多相关《第六章子程序结构(精品).ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 在在程程序序设设计计中中,可可以以发发现现一一些些多多次次无无规规律律重重复复的的程程序序段段或或语语句句序序列列。解解决决此此类类问问题题一一个个行行之之有有效效的的方方法法就就是是将将它它们们设设计计成成可可供供反反复复调调用用的的独独立立的的子子程程序序结结构构,以以便便在在需需要要时时调用。在汇编语言中调用。在汇编语言中,子程序又称过程子程序又称过程子程序又称过程子程序又称过程。调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序。第第6章章 子程序结构子程序结构2/8/20232/8/202
2、31 1ch6ch6子程序的基本结构包括以下几个部分:子程序的基本结构包括以下几个部分:(1 1 1 1)子程序定义)子程序定义)子程序定义)子程序定义 (2 2 2 2)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场 (3 3 3 3)子程序体)子程序体)子程序体)子程序体 (4 4 4 4)子程序返回)子程序返回)子程序返回)子程序返回 子程序的结构子程序的结构2/8/20232/8/20232 2ch6ch6 子子程程序序的的定定义义是是由由过过程程定定义义伪伪指指令令PROCPROC和和ENDPENDP来完成的。其格式如下:来完成的。其格式如下:过程名过
3、程名过程名过程名 PROC NEAR/FARPROC NEAR/FARPROC NEAR/FARPROC NEAR/FAR 过程名过程名过程名过程名 ENDPENDPENDPENDP 其其其其中中中中PROCPROCPROCPROC表表表表示示示示过过过过程程程程定定定定义义义义开开开开始始始始,ENDPENDPENDPENDP表表表表示示示示过过过过程程程程定定定定义结束。义结束。义结束。义结束。过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,
4、即段一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(NEAR NEAR NEAR NEAR 和和和和 FAR)FAR)FAR)FAR)。6.1.1 子程序的定义子程序的定义6.1 子程序的设计方法子程序的设计方法2/8/20232/8/20233 3ch6ch61.1.如果调用程序和过程在如果调用程序和过程在同一代码段同一代码段同一代码段同一代码段中,则使用中,则使用NEARNEARNEARNEAR属属属属性性性性;MAIN PROC
5、FARMAIN PROC FAR CALL SUBR1CALL SUBR1 RETMAIN ENDPMAIN ENDP;SUBR1 PROC SUBR1 PROC NEARNEAR RETSUBR1 ENDPSUBR1 ENDPMAIN PROC FARMAIN PROC FAR CALL SUBR1CALL SUBR1 RETSUBR1 PROC SUBR1 PROC NEARNEAR RETSUBR1 ENDPSUBR1 ENDPMAIN ENDPMAIN ENDP例例6.16.1过程嵌套定义过程嵌套定义2/8/20232/8/20234 4ch6ch62.2.如果如果调用程序和过程不在同
6、一代码段中调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中,则使用,则使用FARFAR属性;属性;SEGX SEGMENT SUBT PROC FARFAR RETSUBT ENDP CALL SUBT SEGX ENDS;SEGY SEGMENTSEGY SEGMENT CALL SUBT SEGY ENDS例例6.26.22/8/20232/8/20235 5ch6ch66.1.2 子程序的调用和返回子程序的调用和返回调用调用:CALL far/near ptr 过程名过程名返回返回:RET n2/8/20232/8/20236 6ch6ch66.
7、1.3 6.1.3 保护现场和恢复现场保护现场和恢复现场例如:若子程序例如:若子程序例如:若子程序例如:若子程序PROGPROG中改变了寄存器中改变了寄存器中改变了寄存器中改变了寄存器AXAX,BXBX,CXCX,DXDX的值,则的值,则的值,则的值,则 可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。PROGPROCPUSHPUSHAXAXPUSH PUSH BX BX PUSH PUSHCXCX;保护现场保护现场保护现场保护现场PUSHPUSHDXDX POPPOPDXDXPOPPOPCXCXPOPPOPBXBX;恢复
8、现场恢复现场恢复现场恢复现场POPPOPAXAXRET;返回断点处返回断点处PROCENDP2/8/20232/8/20237 7ch6ch66.1.4 主程序与子程序参数传递方式主程序与子程序参数传递方式 1 1 通过寄存器传送参数通过寄存器传送参数通过寄存器传送参数通过寄存器传送参数 这是最常用的一种方式,使用方便,但参数很多时不能这是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。使用这种方法。例例6.3 6.3 十进制到十六进制转换的程序。程序要求从键盘十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上取得一个十进制数,然后把该数以
9、十六进制的形式在屏幕上显示出来。显示出来。开始开始调用DECIBIN调用CRLF调用BINIHEX调用CRLF结束从键盘取得十进制从键盘取得十进制数,保存到数,保存到BXBX中中显示回车和换行显示回车和换行用十六进制形式用十六进制形式显示显示BXBX中的数中的数2/8/20232/8/20238 8ch6ch6Decihex segment assume cs:DecihexRepeat:Repeat:call call decibindecibin call call crlfcrlf call call binihexbinihex call call crlfcrlf MOV AH,4C
10、H MOV AH,4CH INT 21H INT 21H DecibinDecibin proc near proc near mov bx,0Newchar:mov ah,1 int 21h sub al,30h jl exit cmp al,9 jg exit cbw xchgxchg ax,ax,bxbx movmov cxcx,10,10 mulmul cxcx xchgxchg ax,ax,bxbx ;每次乘的每次乘的 add add bxbx,ax ,ax ;结果在结果在BX中中 jmp newchar Exit:retDecibinDecibin endpendp 2/8/202
11、32/8/20239 9ch6ch6BinihexBinihex proc near proc near movmov chch,4,4Rotate:Rotate:movmov cl cl,4,4 rolrol bxbx,cl cl movmov dl,dl,blbl and dl,0fh and dl,0fh add dl,30h add dl,30h cmpcmp dl,3ah dl,3ah jl jl print print add dl,7h add dl,7h Print:Print:movmov ah,2 ah,2 intint 21h 21h decdec chch jnzjnz
12、 rotate rotate ret ret BinihexBinihex endpendpCrlfCrlf proc near proc near movmov ah,2 ah,2 movmov dl,dl,odhodh intint 21h 21h movmov dl,dl,oahoah intint 21h 21h ret retCrlfCrlf endpendpDecihex ends end repeat 2/8/20232/8/20231010ch6ch62 2如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件
13、(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。3 4 例例例例 6.4_1 6.4_1 6.4_1 6.4_1 主程序主程序主程序主程序MAINMAINMAINMAIN和过程和过程和过程和过程PROADDPROADDPROADDPROADD在同一源文在同一源文在同一源文在同一源文件中,要求用过程件中,要求用过程件中,要求用过程件中,要求用过程PROADDPROADDPROADDPROADD累加数组的所有元素,并累加数组的所有元素,并累加数组的所有元素,并累加数
14、组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元把和(不考虑溢出的可能性)送到指定的存储单元把和(不考虑溢出的可能性)送到指定的存储单元把和(不考虑溢出的可能性)送到指定的存储单元中去中去中去中去2/8/20232/8/20231111ch6ch6DATA SEGMENTDATA SEGMENT ARY ARY DW 100 DUP(?)DW 100 DUP(?)COUNTCOUNT DW 100 DW 100 SUM SUM DW?DW?DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT MAIN PROC FARMAIN PROC FAR AS
15、SUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATASTART:PUSH DSSTART:PUSH DS SUB AX,AX SUB AX,AX PUSH AX PUSH AX MOV AX,DATA MOV AX,DATA CALL NEAR PTR PROADDCALL NEAR PTR PROADD RET RETMAIN ENDPMAIN ENDPPROADD PROC NEARPROADD PROC NEAR PUSH AXPUSH AX PUSH CX PUSH CX PUSH SI PUSH SI PUSH DI PUSH DI LEA SI,L
16、EA SI,ARYARY MOV CX,MOV CX,COUNTCOUNT XOR AX,AX XOR AX,AXNEXT:ADD AX,SINEXT:ADD AX,SI ADD SI,2 ADD SI,2 LOOP NEXT LOOP NEXT MOV MOV SUMSUM,AX,AX POP DIPOP DI POP SI POP SI POP CX POP CX POP AX POP AX RET RETPROADD ENDPPROADD ENDPCODE ENDSCODE ENDS END START END START2/8/20232/8/20231212ch6ch6CODE SE
17、GMENTARY DW 100 DUP(?)ARY DW 100 DUP(?)COUNT DW 100COUNT DW 100SUM DW?SUM DW?NUM DW 100 DUP(?)NUM DW 100 DUP(?)N DW 100N DW 100TOTAL DW?TOTAL DW?TABLE DW?TABLE DW?DW?DW?DW?DW?MOV TABLE,OFFSET ARYMOV TABLE,OFFSET ARYMOV TABLE+2,OFFSET COUNTMOV TABLE+2,OFFSET COUNTMOV TABLE+4,OFFSET SUNMOV TABLE+4,OFF
18、SET SUNMOV BX,OFFSET TABLEMOV BX,OFFSET TABLECALL PROADD CALL PROADD ;计算计算SUMSUMPROADD PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI PUSH SI,MOV SI,BX MOV DI,MOV DI,BX+2BX+2 MOV CX,MOV CX,DI DI MOV DI,MOV DI,BX+4BX+4 XOR AX,AX XOR AX,AXNEXT:ADD AX,NEXT:ADD AX,SISI ADD SI,2 ADD SI,2 LOOP NEXT LOOP NEXT M
19、OV MOV 【DI,DI,AX AX POP DIPOP DI POP SI POP CX POP AX RETPROADD ENDPCODE ENDS END START3 3 通过地址表传递参数通过地址表传递参数例例6.4_26.4_22/8/20232/8/20231313ch6ch64 4 通过堆栈传递地址或参数通过堆栈传递地址或参数Data segmentAry dw 100 dup(?)Count db 100Sum dw?Data endsStack segment para stack stack dw 100 dup(?)tos label wordStack endsCo
20、de1 segment assume cs:code1,ds:data,ss;stackMain proc farStart:push ds xor ax,ax push ax mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,offset tos Mov bx,offset ary Push bx Mov bx,offset count Push bx Mov bx,offset sum Push bx Call far ptr proadd movmov al,sum al,sum mov dl,al mov ah,2 int 21h
21、ret Main endp Code1 ends例例6.4_36.4_32/8/20232/8/20231414ch6ch6Sum地址地址Count地址地址Ary地址地址spdisicxaxbp(Sp)bpIPCSCode2 segment assume cs:code2ProaddProadd proc far proc far push bp mov bp,sp push ax push cx push si push di mov si,bp+0ah mov di,bp+08h mov cl,di mov di,bp+06h xor al,alAgain:add al,si inc si
22、 dec cl jnz again mov di,al pop di pop si pop cx pop ax pop bp ret 6ret 6Proadd endpCode2 ends end startbp+0ahbp+08hbp+06hSpSpSpSpSp2/8/20232/8/20231515ch6ch6(1)PUBLIC(1)PUBLIC伪指令伪指令 格式:格式:PUBLIC PUBLIC PUBLIC PUBLIC 符号符号符号符号 ,符号,符号,符号,符号 功功能能:说说明明其其后后的的符符号号是是全全局局符符号号。全全局局符符号号能能被被其其他他模模块引用。块引用。(局部符号
23、)局部符号)(2)EXTRN(2)EXTRN伪指令伪指令 格式:格式:EXTRN EXTRN EXTRN EXTRN 符号:类型符号:类型符号:类型符号:类型 ,符号:类型,符号:类型,符号:类型,符号:类型 功功能能:说说明明在在本本模模块块中中需需要要引引用用的的、由由其其他他模模块块定定义义的的符符号,即外部符号号,即外部符号。5 5 多个模块之间的参数传送问题多个模块之间的参数传送问题多个模块之间的参数传送问题多个模块之间的参数传送问题2/8/20232/8/20231616ch6ch6;source module 1;source module 1extrnextrn var2:wo
24、rd,lab2:far var2:word,lab2:farpublic var1,lab1public var1,lab1Data1 segmentData1 segment var1 db?var1 db?var3 var3 dwdw?var4 var4 dwdw?Data1 endsData1 endscode1 segmentcode1 segment assume cs:code1,ds:data1 assume cs:code1,ds:data1Main proc farMain proc far start:start:movmov ax,data1 ax,data1 movmo
25、v ds,axds,ax lab1 lab1:movmov ah,4ch ah,4ch intint 21h 21hMain Main endpendpCode1 ends Code1 ends End startEnd start;source module 2source module 2 extern var1:byte,var4:wordextern var1:byte,var4:wordextern var1:byte,var4:wordextern var1:byte,var4:word public var2 public var2 public var2 public var2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 子程序结构精品 第六 子程序 结构 精品
限制150内