第6章 子程序结构47059.ppt
《第6章 子程序结构47059.ppt》由会员分享,可在线阅读,更多相关《第6章 子程序结构47059.ppt(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 在在程程序序设设计计中中,我我们们会会发发现现一一些些多多次次无无规规律律重重复复的的程程序序段段或或语语句句序序列列。解解决决此此类类问问题题一一个个行行之之有有效效的的方方法法就就是是将将它它们们设设计计成成可可供供反反复复调调用用的的独独立立的的子子程程序序结结构构,以以便便在在需需要要时调用。在汇编语言中时调用。在汇编语言中,子程序又称过程子程序又称过程子程序又称过程子程序又称过程。调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序。第第6章章 子程序结构子程序结构1/31/20231ch6
2、子程序的基本结构包括以下几个部分:子程序的基本结构包括以下几个部分:(1 1 1 1)子程序定义)子程序定义)子程序定义)子程序定义 (2 2 2 2)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场 (3 3 3 3)子程序体)子程序体)子程序体)子程序体 (4 4 4 4)子程序返回)子程序返回)子程序返回)子程序返回 子程序的结构子程序的结构1/31/20232ch6 子子程程序序的的定定义义是是由由过过程程定定义义伪伪指指令令PROCPROC和和ENDPENDP来完成的。其格式如下:来完成的。其格式如下:过程名过程名过程名过程名 PROC NEAR/FAR
3、PROC NEAR/FARPROC NEAR/FARPROC NEAR/FAR 过程名过程名过程名过程名 ENDPENDPENDPENDP 其其其其中中中中PROCPROCPROCPROC表表表表示示示示过过过过程程程程定定定定义义义义开开开开始始始始,ENDPENDPENDPENDP表表表表示示示示过过过过程程程程定定定定义结束。义结束。义结束。义结束。过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,即段
4、一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(NEAR NEAR NEAR NEAR 和和和和 FAR)FAR)FAR)FAR)。6.1.1 子程序的定义子程序的定义6.1 子程序的设计方法子程序的设计方法1/31/20233ch6如果调用程序和过程在如果调用程序和过程在同一代码段同一代码段同一代码段同一代码段中,则使用中,则使用NEARNEAR属性属性属性属性;MAIN PROC FARMAIN PROC FAR CALL SUBR1CALL SUBR1 RETMAIN
5、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 ENDP6.1.2 子程序的调用和返回子程序的调用和返回1/31/20234ch6如果如果调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中,则使用,则使用
6、FAR属性;属性;SEGX SEGMENTSEGX SEGMENT SUBT PROC FARFAR RETSUBT ENDP CALL SUBT SEGX ENDSSEGX ENDS;SEGY SEGMENTSEGY SEGMENTSEGY SEGMENTSEGY SEGMENT CALL SUBT SEGY ENDSSEGY ENDS1/31/20235ch66.1.3 6.1.3 保护现场和恢复现场保护现场和恢复现场例如:若子程序例如:若子程序例如:若子程序例如:若子程序PROGPROG中改变了寄存器中改变了寄存器中改变了寄存器中改变了寄存器AXAX,BXBX,CXCX,DXDX的值,则
7、的值,则的值,则的值,则 可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。PROGPROCPUSHPUSHAXAXPUSH PUSH BX BX PUSH PUSHCXCX;保护现场保护现场保护现场保护现场PUSHPUSHDXDX POPPOPDXDXPOPPOPCXCXPOPPOPBXBX;恢复现场恢复现场恢复现场恢复现场POPPOPAXAXRET;返回断点处返回断点处PROCENDP1/31/20236ch66.1.4 主程序与子程序参数传递方式主程序与子程序参数传递方式 1 1 通过寄存器传送参数通过寄存器传送参数通
8、过寄存器传送参数通过寄存器传送参数 这是最常用的一种方式,使用方便,但参数很多时不能这是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。使用这种方法。例:十进制到十六进制转换的程序。程序要求从键盘取例:十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来。示出来。开始开始调用DECIBIN调用CRLF调用BINIHEX调用CRLF结束从键盘取得十进制从键盘取得十进制数,保存到数,保存到BXBX中中显示回车和换行显示回车和换行用十六进制形式用十六进制形式显示显示BXBX中的数中的数1/
9、31/20237ch6Decihex segment assume cs:DecihexMain proc farMain proc farRepeat:push Repeat:push dsds xor xor ax,ax ax,ax push ax push ax call call decibindecibin call call crlfcrlf call call binihexbinihex call call crlfcrlf retretMain Main endpendp Decibin Decibin proc near proc near mov bx,0Newchar:
10、mov ah,1 int 21h sub al,30h jl exit cmp al,9 jg exit cbw xchg xchg ax,ax,bxbx mov cx mov cx,10,10 mul mul cxcx xchg xchg ax,ax,bx bx ;每次乘的每次乘的 add add bxbx,ax ,ax ;结果在结果在BX中中 jmp newchar Exit:retDecibin endp Decibin endp 1/31/20238ch6Binihex Binihex proc near proc near mov chmov ch,4,4Rotate:Rotate:
11、mov clmov cl,4,4 rol rol bxbx,cl cl mov mov dl,dl,blbl and dl,0fhand dl,0fh add dl,30h add dl,30h cmp cmp dl,3ah dl,3ah jl jl print print add dl,7h add dl,7h Print:Print:mov mov ah,2 ah,2 int int 21h 21h dec dec chch jnz jnz rotate rotate ret ret Binihex endpBinihex endpCrlf Crlf proc nearproc near
12、mov mov ah,2 ah,2 mov mov dl,dl,odhodh int int 21h 21h mov mov dl,dl,oahoah int int 21h 21h ret retCrlf endpCrlf endpDecihex ends end repeat 1/31/20239ch62 2如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接
13、访问模块中的变量。3 4 例例例例 6.4 6.4 6.4 6.4 主程序主程序主程序主程序MAINMAINMAINMAIN和过程和过程和过程和过程PROADDPROADDPROADDPROADD在同一源文件在同一源文件在同一源文件在同一源文件中,要求用过程中,要求用过程中,要求用过程中,要求用过程PROADDPROADDPROADDPROADD累加数组的所有元素,并把累加数组的所有元素,并把累加数组的所有元素,并把累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中和(不考虑溢出的可能性)送到指定的存储单元中和(不考虑溢出的可能性)送到指定的存储单元中和(不考虑溢出的可能性)
14、送到指定的存储单元中去去去去1/31/202310ch6DATA 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 ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATASTART:PUSH DSSTART:PUSH DS SUB AX,AX SUB AX,AX PUSH PUSH AX
15、 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,LEA SI,ARYARY MOV CX,MOV CX,COUNTCOUNT XOR AX,AX XOR AX,AXNEXT:ADD AX,SINEXT:ADD AX,SI ADD SI,2 ADD SI,
16、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 START1/31/202311ch6CODE SEGMENTARY DW 100 DUP(?)ARY DW 100 DUP(?)COUNT DW 100COUNT DW 100SUM DW?SUM DW?NUM DW 100 DUP(?)NUM DW 100 DUP(?)N D
17、W 100N DW 100TOTAL DW?TOTAL DW?;MOV TABLE,OFFSET ARYMOV TABLE,OFFSET ARYMOV TABLE+2,OFFSET COUNTMOV TABLE+2,OFFSET COUNTMOV TABLE+4,OFFSET SUNMOV TABLE+4,OFFSET SUNMOV BX,OFFSET TABLEMOV BX,OFFSET TABLECALL CALL PROADD PROADD ;计算计算计算计算SUMSUMPROADD PROC NEAR PUSH AX PUSH CX PUSH SI MOV SI,MOV SI,MOV
18、CX,MOV CX,MOV DI,MOV DI,XOR AX,AX XOR AX,AXNEXT:ADD AX,SINEXT:ADD AX,SI ADD SI,2 ADD SI,2 LOOP NEXT LOOP NEXT MOV MOV ,AX ,AX POP SI POP CX POP AX RETPROADD ENDPCODE ENDS END STARTBXBX+2BX+4DI3 3 通过地址表传递参数通过地址表传递参数1/31/202312ch6例:把内存中字变量例:把内存中字变量例:把内存中字变量例:把内存中字变量numnum的值,的值,的值,的值,转换为转换为转换为转换为4 4个用个
19、用个用个用ASCASC码表示的码表示的码表示的码表示的1616进制数码,串的起始地址为进制数码,串的起始地址为进制数码,串的起始地址为进制数码,串的起始地址为stringstring 。Data segmentNum dw 25afhString db 4 dup(?),$,0dh,0ahData endsStack segment para stack stack db 100 dup(?)Stack endsCode segment assume cs:code,ds:data,ss:stackMain proc farBegin:push ds xor ax,ax push ax mov
20、 ax,data mov ds,ax lea lea bx bx,string,string push bxbx push num call call binhex binhex lea dx,string mov ah,9 int 21h retMain endp2000:00002000:00023000:00003000:00013000:00033000:00043000:00073000:00093000:000d3000:000e3000:00123000:00153000:001915150000af250200spstring地址地址NumLea dx,string地址(地址(
21、IP)4 4 通过堆栈传递地址或参数通过堆栈传递地址或参数1/31/202313ch6Binhex Binhex proc nearproc near push bp mov bp,sp push ax push di push bx push cx pushf mov ax,bp+4 ;ax=25afh mov di,bp+6 ;di=0002 mov ch,4 mov cl,4 roat:rol ax,cl mov bl,al and bl,0fh add bl,30h cmp bl,39h jle next add bl,7h 0015001525af0002spstring地址地址Nu
22、mLea dx,string地址地址(IP)flagcxbxdiaxbp(Sp)bpbp+2bp+4bp+6Bp-6Bp-4Bp-21/31/202314ch6Next:mov di,bl inc di dec ch jnz rota popf pop cx pop bx pop di pop ax pop bp ret 4ret 4Binhex endpBinhex endpCode ends end begin 0015001525af0002spstring地址地址NumLea dx,string地址地址(IP)flagcxbxdiaxbpsp1/31/202315ch6 例例例例3 3
23、:求:求:求:求1010个数的累加值个数的累加值个数的累加值个数的累加值.-远调用远调用远调用远调用Data segmentAry db 10 dup(?)Count db 10Sum db?Data endsStack segment para stack stack db 100 dup(?)Stack endsCode1 segment assume cs:code1,ds:data,ss;stackMain proc farStart:push ds xor ax,ax push ax mov ax,data mov ds,ax1/31/202316ch6 Mov bx,offset
24、ary Push bx Mov bx,offset count Push bx Mov bx,offset sum Push bx Call far ptr proadd mov mov al,sumal,sum mov dl,al mov ah,2 int 21h retMain endpCode1 endsSum地址地址Count地址地址Ary地址地址MOV AL,SUM MOV AL,SUM 地址地址地址地址spIPCS1/31/202317ch6Sum地址地址Count地址地址Ary地址地址spMOV AL,SUM 地址地址disicxaxbp(Sp)bpIPCSCode2 segme
25、nt assume cs:code2Proadd Proadd proc farproc 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 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 子程序结构47059 子程序 结构 47059
限制150内