汇编语言第六章子程序结构.ppt
《汇编语言第六章子程序结构.ppt》由会员分享,可在线阅读,更多相关《汇编语言第六章子程序结构.ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 在在程程序序设设计计中中,可可以以发发现现一一些些多多次次无无规规律律重重复复的的程程序序段段或或语语句句序序列列。解解决决此此类类问问题题一一个个行行之之有有效效的的方方法法就就是是将将它它们们设设计计成成可可供供反反复复调调用用的的独独立立的的子子程程序序结结构构,以以便便在在需需要要时时调用。在汇编语言中调用。在汇编语言中,子程序又称过程子程序又称过程子程序又称过程子程序又称过程。调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序。第第6章章 子程序结构子程序结构2/18/20231ch6子程
2、序的基本结构包括以下几个部分:子程序的基本结构包括以下几个部分:(1 1 1 1)子程序定义)子程序定义)子程序定义)子程序定义 (2 2 2 2)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场 (3 3 3 3)子程序体)子程序体)子程序体)子程序体 (4 4 4 4)子程序返回)子程序返回)子程序返回)子程序返回 子程序的结构子程序的结构2/18/20232ch6 子子程程序序的的定定义义是是由由过过程程定定义义伪伪指指令令PROCPROC和和ENDPENDP来完成的。其格式如下:来完成的。其格式如下:过程名过程名过程名过程名 PROC NEAR/FAR P
3、ROC NEAR/FAR PROC NEAR/FAR PROC NEAR/FAR 过程名过程名过程名过程名 ENDP ENDP ENDP ENDP 其其其其中中中中PROCPROCPROCPROC表表表表示示示示过过过过程程程程定定定定义义义义开开开开始始始始,ENDPENDPENDPENDP表表表表示示示示过过过过程程程程定定定定义结束。义结束。义结束。义结束。过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属
4、性,即段一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(NEAR NEAR NEAR NEAR 和和和和 FAR)FAR)FAR)FAR)。6.1.1 子程序的定义子程序的定义6.1 子程序的设计方法子程序的设计方法2/18/20233ch61.1.如果调用程序和过程在如果调用程序和过程在同一代码段同一代码段同一代码段同一代码段中,则使用中,则使用NEARNEARNEARNEAR属属属属性性性性;MAIN PROC FARMAIN PROC FAR CALL SUBR1CAL
5、L 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/18/20234ch62.2.如果如果调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中调用程序和过程
6、不在同一代码段中,则使用,则使用FARFAR属性;属性;SEGX SEGMENT SUBT PROC FARFAR RETSUBT ENDP CALL SUBT SEGX ENDS;SEGY SEGMENTSEGY SEGMENT CALL SUBT SEGY ENDS例例6.26.22/18/20235ch66.1.2 子程序的调用和返回子程序的调用和返回调用调用:CALL far/near ptr 过程名过程名返回返回:RET n2/18/20236ch66.1.3 6.1.3 保护现场和恢复现场保护现场和恢复现场例如:若子程序例如:若子程序例如:若子程序例如:若子程序PROGPROG中改
7、变了寄存器中改变了寄存器中改变了寄存器中改变了寄存器AXAX,BXBX,CXCX,DXDX的值,则的值,则的值,则的值,则 可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。PROGPROCPUSHPUSHAXAXPUSH PUSH BX BX PUSH PUSHCXCX;保护现场;保护现场;保护现场;保护现场PUSHPUSHDXDX POPPOPDXDXPOPPOPCXCXPOPPOPBXBX;恢复现场恢复现场恢复现场恢复现场POPPOPAXAXRET;返回断点处返回断点处PROCENDP2/18/20237ch66.1.
8、4 主程序与子程序参数传递方式主程序与子程序参数传递方式 1 1 通过寄存器传送参数通过寄存器传送参数通过寄存器传送参数通过寄存器传送参数 这是最常用的一种方式,使用方便,但参数很多时不能这是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。使用这种方法。例例6.3 6.3 十进制到十六进制转换的程序。程序要求从键盘十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来。显示出来。开始开始调用DECIBIN调用CRLF调用BINIHEX调用CRLF结束从键盘取得十进制从键盘取得十进制数,
9、保存到数,保存到BXBX中中显示回车和换行显示回车和换行用十六进制形式用十六进制形式显示显示BXBX中的数中的数2/18/20238ch6Decihex segment assume cs:DecihexMain proc farMain proc farRepeat:push dsRepeat:push ds xor ax,ax xor ax,ax push ax push ax call decibincall decibin call crlf call crlf call binihex call binihex call crlf call crlf ret retMain endp
10、Main endp Decibin proc nearDecibin proc near mov bx,0Newchar:mov ah,1 int 21h sub al,30h jl exit cmp al,9 jg exit cbw xchg ax,bxxchg ax,bx mov cx,10 mov cx,10 mul cx mul cx xchg ax,bx xchg ax,bx ;每次乘的每次乘的 add bx,ax add bx,ax ;结果在结果在BX中中 jmp newchar Exit:retDecibin endp Decibin endp 2/18/20239ch6Bini
11、hex proc nearBinihex proc near mov ch,4mov ch,4Rotate:mov cl,4 Rotate:mov cl,4 rol bx,cl rol bx,cl mov dl,bl mov dl,bl and dl,0fh and dl,0fh add dl,30h add dl,30h cmp dl,3ah cmp dl,3ah jl print jl print add dl,7h add dl,7h Print:mov ah,2 Print:mov ah,2 int 21h int 21h dec ch dec ch jnz rotate jnz ro
12、tate ret ret Binihex endpBinihex endpCrlf proc nearCrlf proc near mov ah,2mov ah,2 mov dl,odh mov dl,odh int 21h int 21h mov dl,oah mov dl,oah int 21h int 21h ret retCrlf endpCrlf endpDecihex ends end repeat 2/18/202310ch62 2如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,如果过程和调
13、用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。3 4 例例例例 6.4_1 6.4_1 6.4_1 6.4_1 主程序主程序主程序主程序MAINMAINMAINMAIN和过程和过程和过程和过程PROADDPROADDPROADDPROADD在同一源文在同一源文在同一源文在同一源文件中,要求用过程件中,要求用过程件中,要求用过程件中,要求用过程PROADDPROADDPROADDPROADD累加数组的所有元素,并累加数组的所有元素,并累加数组的所有元素,并累加数组的所有元素,并把和(不考虑
14、溢出的可能性)送到指定的存储单元把和(不考虑溢出的可能性)送到指定的存储单元把和(不考虑溢出的可能性)送到指定的存储单元把和(不考虑溢出的可能性)送到指定的存储单元中去中去中去中去2/18/202311ch6DATA 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 ASSUM
15、E 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,LEA SI,ARYARY MOV CX,MOV CX
16、,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/18/202312ch6CODE SEGMENTARY DW 100 DUP(?)ARY DW 100 DUP(?
17、)COUNT DW 100COUNT DW 100SUM DW?SUM DW?NUM DW 100 DUP(?)NUM DW 100 DUP(?)N DW 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 PROADD CALL PROADD
18、 ;计算;计算SUMSUMPROADD PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI PUSH 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 MOV MOV 【DI,DI,AX AX POP DIPOP DI POP SI POP CX POP AX RETPROADD ENDPCODE E
19、NDS END START3 3 通过地址表传递参数通过地址表传递参数例例6.4_26.4_22/18/202313ch64 4 通过堆栈传递地址或参数通过堆栈传递地址或参数Data segmentAry dw 100 dup(?)Count db 100Sum dw?Data endsStack segment para stack stack dw 100 dup(?)tos label wordStack endsCode1 segment assume cs:code1,ds:data,ss;stackMain proc farStart:push ds xor ax,ax push
20、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 mov al,summov al,sum mov dl,al mov ah,2 int 21h ret Main endp Code1 ends例例6.4_36.4_32/18/202314ch6Sum地址地址Count地址地址Ary地址地址spdisicxaxbp(
21、Sp)bpIPCSCode2 segment assume cs:code2Proadd proc farProadd 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 dec cl jnz again mov di,al pop di pop si pop cx pop ax pop bp ret 6ret 6Proadd endpCode2 ends end
22、 startbp+0ahbp+08hbp+06hSpSpSpSpSp2/18/202315ch6(1)PUBLIC(1)PUBLIC伪指令伪指令 格式:格式:PUBLIC PUBLIC PUBLIC PUBLIC 符号符号符号符号 ,符号,符号,符号,符号 功功能能:说说明明其其后后的的符符号号是是全全局局符符号号。全全局局符符号号能能被被其其他他模模块引用。块引用。(局部符号)局部符号)(2)EXTRN(2)EXTRN伪指令伪指令 格式:格式:EXTRN EXTRN EXTRN EXTRN 符号:类型符号:类型符号:类型符号:类型 ,符号:类型,符号:类型,符号:类型,符号:类型 功功能能:
23、说说明明在在本本模模块块中中需需要要引引用用的的、由由其其他他模模块块定定义义的的符符号,即外部符号号,即外部符号。5 5 多个模块之间的参数传送问题多个模块之间的参数传送问题多个模块之间的参数传送问题多个模块之间的参数传送问题2/18/202316ch6;source module 1;source module 1extrn var2:word,lab2:farextrn var2:word,lab2:farpublic var1,lab1public var1,lab1Data1 segmentData1 segment var1 db?var1 db?var3 dw?var3 dw?v
24、ar4 dw?var4 dw?Data1 endsData1 endscode1 segmentcode1 segment assume cs:code1,ds:data1 assume cs:code1,ds:data1Main proc farMain proc far start:mov ax,data1 start:mov ax,data1 mov ds,ax mov ds,ax lab1 lab1:mov ah,4ch mov ah,4ch int 21h int 21hMain endpMain endpCode1 ends Code1 ends End startEnd star
25、t;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 Data2 segmentData2 segmentData2 segmentData2 segment var2 dw?var2 dw?var2 dw?var2 dw?var3 dw?var3 dw?var3 dw?var3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 第六 章子 程序结构
限制150内