汇编语言第六章子程序结构.ppt
《汇编语言第六章子程序结构.ppt》由会员分享,可在线阅读,更多相关《汇编语言第六章子程序结构.ppt(44页珍藏版)》请在三一办公上搜索。
1、在程序设计中,可以发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。,第6章 子程序结构,子程序的基本结构包括以下几个部分:(1)子程序定义(2)保护现场和恢复现场(3)子程序体(4)子程序返回,子程序的结构,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,
2、具有三种属性,即段属性、偏移地址属性以及类型属性(NEAR 和 FAR)。,6.1.1 子程序的定义,6.1 子程序的设计方法,1.如果调用程序和过程在同一代码段中,则使用NEAR属性;,MAIN PROC FAR CALL SUBR1 RETMAIN ENDP;SUBR1 PROC NEAR RETSUBR1 ENDP,MAIN PROC FAR CALL SUBR1 RETSUBR1 PROC NEAR RETSUBR1 ENDPMAIN ENDP,例6.1,过程嵌套定义,2.如果调用程序和过程不在同一代码段中,则使用FAR属性;,SEGX SEGMENT SUBT PROC FAR RE
3、TSUBT ENDP CALL SUBT SEGX ENDS;SEGY SEGMENT CALL SUBT SEGY ENDS,例6.2,6.1.2 子程序的调用和返回,调用:CALL far/near ptr 过程名,返回:RET n,6.1.3 保护现场和恢复现场,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则 可采用如下方法保护和恢复现场。PROGPROCPUSHAXPUSH BX PUSHCX;保护现场PUSHDX POPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROCENDP,6.1.4 主程序与子程序参数传递方式,1 通过寄存器传送参数 这
4、是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。例6.3 十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来。,开始,调用DECIBIN,调用CRLF,调用BINIHEX,调用CRLF,结束,从键盘取得十进制数,保存到BX中,显示回车和换行,用十六进制形式显示BX中的数,Decihex segment assume cs:DecihexMain proc farRepeat:push ds xor ax,ax push ax call decibin call crlf call binihex call crlf retMain
5、 endp,Decibin proc near mov bx,0Newchar:mov ah,1 int 21h sub al,30h jl exit cmp al,9 jg exit cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx;每次乘的 add bx,ax;结果在BX中 jmp newchar Exit:retDecibin endp,Binihex proc near mov ch,4Rotate:mov cl,4 rol bx,cl mov dl,bl and dl,0fh add dl,30h cmp dl,3ah jl print add d
6、l,7h Print:mov ah,2 int 21h dec ch jnz rotate ret Binihex endp,Crlf proc near mov ah,2 mov dl,odh int 21h mov dl,oah int 21h retCrlf endpDecihex ends end repeat,如果过程和调用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。例 6.4_1 主程序MAIN和过程PROADD在同一源文件中,要求用过程PROADD累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中去,DATA SEGMENT ARY DW 10
7、0 DUP(?)COUNT DW 100 SUM DW?DATA ENDSCODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATASTART:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA CALL NEAR PTR PROADD RETMAIN ENDP,PROADD PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI LEA SI,ARY MOV CX,COUNT XOR AX,AXNEXT:ADD AX,SI ADD SI,2 LOOP NEXT MOV SUM,AX POP DI PO
8、P SI POP CX POP AX RETPROADD ENDPCODE ENDS END START,CODE SEGMENTARY DW 100 DUP(?)COUNT DW 100SUM DW?NUM DW 100 DUP(?)N DW 100TOTAL DW?MOV TABLE,OFFSET ARYMOV TABLE+2,OFFSET COUNTMOV TABLE+4,OFFSET SUNMOV BX,OFFSET TABLECALL PROADD;计算SUM,PROADD PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI PUSH SI,BX MO
9、V DI,BX+2 MOV CX,DI MOV DI,BX+4 XOR AX,AXNEXT:ADD AX,SI ADD SI,2 LOOP NEXT MOV【DI,AX POP DI POP SI POP CX POP AX RETPROADD ENDPCODE ENDS END START,3 通过地址表传递参数,例6.4_2,4 通过堆栈传递地址或参数,Data segmentAry dw 100 dup(?)Count db 100Sum dw?Data endsStack segment para stack stack dw 100 dup(?)tos label wordStack
10、 endsCode1 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 mov al,sum mov dl,al mov ah,2 int 21h ret
11、 Main endp Code1 ends,例6.4_3,Sum地址Count地址Ary地址,sp,disicxaxbp,(Sp)bp,IPCS,Code2 segment assume cs:code2Proadd 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,
12、pop ax pop bp ret 6Proadd endpCode2 ends end start,bp+0ah,bp+08h,bp+06h,Sp,Sp,Sp,Sp,Sp,(1)PUBLIC伪指令 格式:PUBLIC 符号,符号 功能:说明其后的符号是全局符号。全局符号能被其他模块引用。(局部符号)(2)EXTRN伪指令 格式:EXTRN 符号:类型,符号:类型 功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。,5 多个模块之间的参数传送问题,;source module 1extrn var2:word,lab2:farpublic var1,lab1Data1 segm
13、ent var1 db?var3 dw?var4 dw?Data1 endscode1 segment assume cs:code1,ds:data1Main proc far start:mov ax,data1 mov ds,ax lab1:mov ah,4ch int 21hMain endpCode1 ends End start,;source module 2 extern var1:byte,var4:word public var2 Data2 segment var2 dw?var3 dw?Data2 ends code2 segment assume cs:code2,d
14、s:data2Main proc far start:mov ax,data2 mov ds,ax mov ah,4ch int 21hMain endpCode2 ends End start,注意:应先有public 定义,然后才有extrn说明,;source module 3extern lab2:farpublic lab2,lab3Data2 segment var2 dw?var3 dw?Data2 endscode3 segment assume cs:code3 Lab2:.Lab3:.Code3 ends End,例6.5 多个模块间的参数共享,;Source model
15、1EXTERN proadd:farDATA SEGMENT common ARY DW 100 DUP(?)COUNT DW 100 SUM DW?DATA ENDSCODE1 SEGMENT MAIN PROC FAR ASSUME CS:CODE1,DS:DATASTART:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA CALL far ptr PROADD RETMAIN ENDPCODE1 ENDS END START,主程序和子过程不在同一个模块的时参数传递方法一,LOOP NEXT:MOV SUM,AX POP DI POP SI POP CX PO
16、P AX RETPROADD ENDPCODE2 ends END,;Source model 2PUBLIC PROADDDATA SEGMENT common ARY DW 100 DUP(?)COUNT DW 100 SUM DW?DATA ENDSCODE2 SEGMENT PROADD PROC FAR ASSUME CS:CODE2,DS:DATA MOV AX,DATA MOV DS,AX PUSH AX PUSH CX PUSH SI PUSH DI LEA SI,ARY MOV CX,COUNT XOR AX,AXNEXT:ADD AX,SI ADD SI,2,(如例6.4_
17、1的参数传递可利用段覆盖),;Source model 1extern var1:word extern output:farextern var2:wordpublic quitlocal_data segment var dw 5 local_data endscode segment assume cs:code,ds:local_datamain proc farstart:mov ax,local_data mov ds,ax mov bx,var mov ax,seg var1 mov es,ax add bx,es:var1,主程序和子过程不在同一个模块的时参数传递方法二,mov
18、 ax,seg var2 mov es,ax sub es:var2,50 jmp ouput quit:mov ah,4ch int 21hmain endpcode ends end start;Source model 2public var1extdata1 segment var1 dw 10 extdata1 ends end,;source model 3public var2extern quit:farextdata2 segment var2 dw 3 extdata2 endspublic outputprogram segment assume cs:program,d
19、s:extdata2 output:jmp quit program ends end,(例6.6 含三个源模块),;Source model 1Global segment publicExtern var1:wordExtern var2:wordGlobal endsLocal_data segment Local_data endscode segment assume cs:code,ds:local_data,es:globalmain proc far,主程序和子过程不在同一个模块的时参数传递方法三,start:mov x,local_data mov ds,ax mov ax,
20、global mov es,ax mov bx,es:var1 add es:var2,bx mov ah,4ch int 21hmain endpcode ends end start,(例6.7 含二个源模块),;source model 2Global segment public public var1 public var2 var1 dw?var2 dw?Global ends end,6.1.5 增强功能的过程定义伪操作,Procname PROC attributes field USER register list,parameter field Procname ENDPA
21、ttributes field(属性字段)包括:Distance:near、far Language type:说明是那种高级语言的子程序 如pascal、c 等。Visibility:说明程序的可见性 是private 或是public。Prologue:是一个宏的名字,允许用宏来控制过程的入口或出口有关的代码USER:该字段用来指定用户所需保存和恢复的寄存器表。Parameter field:参数字段,允许用户指定该过程所用的参数。标识符:类型,标识符:类型,Data segmentAry db 10 dup(?)Count db 10Sum db?Data endsStack segme
22、nt 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,ax,Mov bx,offset ary Push bx Mov bx,offset count Push bx Mov bx,offset sum Push bx Call far ptr proadd mov al,sum mov dl,al mov ah,2 int 21h retMai
23、n endpCode1 ends,对例6.4 采用用增强功能过程定义伪操作实现,Code2 segment assume cs:code2Proadd 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 6Proadd endpCod
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 第六 章子 程序结构
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5993795.html