第6章 子程序结构47195.ppt
《第6章 子程序结构47195.ppt》由会员分享,可在线阅读,更多相关《第6章 子程序结构47195.ppt(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章 在在程程序序设设计计中中,我我们们会会发发现现一一些些多多次次无无规规律律重重复复的的程程序序段段或或语语句句序序列列。解解决决此此类类问问题题一一个个行行之之有有效效的的方方法法就就是是将将它它们们设设计计成成可可供供反反复复调调用用的的独独立立的的子子程程序序结结构构,以以便便在在需需要要时调用。在汇编语言中时调用。在汇编语言中,子程序又称过程子程序又称过程子程序又称过程子程序又称过程。调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序调用子程序的程序称为主
2、调程序或主程序调用子程序的程序称为主调程序或主程序。第第6章章 子程序结构子程序结构1/31/20231ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章子程序的基本结构包括以下几个部分:子程序的基本结构包括以下几个部分:(1 1 1 1)子程序定义)子程序定义)子程序定义)子程序定义 (2 2 2 2)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场)保护现场和恢复现场 (3 3 3 3)子程序体)子程序体)子程序体)子程序体 (4 4 4 4)子程序返回)子程序返回)子程序返回)子程序返回 子程序的结构子程序的结构
3、1/31/20232ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章 子子程程序序的的定定义义是是由由过过程程定定义义伪伪指指令令PROCPROC和和ENDPENDP来完成的。其格式如下:来完成的。其格式如下:过程名过程名过程名过程名 PROC NEAR/FARPROC NEAR/FARPROC NEAR/FARPROC NEAR/FAR 过程名过程名过程名过程名 ENDPENDPENDPENDP 其其其其中中中中PROCPROCPROCPROC表表表表示示示示过过过过程程程程定定定定义义义义开开开开始始始始,ENDPENDP
4、ENDPENDP表表表表示示示示过过过过程程程程定定定定义结束。义结束。义结束。义结束。过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,即段一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(属性、偏移地址属性以及类型属性(NEAR NEAR NEAR NEAR 和和和和 FAR)FAR)FAR)FAR)。6.1.1 子程序
5、的定义子程序的定义6.1 子程序的设计方法子程序的设计方法1/31/20233ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章如果调用程序和过程在如果调用程序和过程在同一代码段同一代码段同一代码段同一代码段中,则使用中,则使用NEARNEAR属性属性属性属性;MAIN PROC FARMAIN PROC FAR CALL SUBR1CALL SUBR1 RETMAIN ENDPMAIN ENDP;SUBR1 PROC SUBR1 PROC NEARNEAR RETSUBR1 ENDPSUBR1 ENDPMAIN PROC FA
6、RMAIN PROC FAR CALL SUBR1CALL SUBR1 RETSUBR1 PROC SUBR1 PROC NEARNEAR RETSUBR1 ENDPSUBR1 ENDPMAIN ENDPMAIN ENDP6.1.2 子程序的调用和返回子程序的调用和返回1/31/20234ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章如果如果调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中调用程序和过程不在同一代码段中,则使用,则使用FAR属性;属性;SEGX SEGMENTSEGX
7、 SEGMENT SUBT PROC FARFAR RETSUBT ENDP CALL SUBT SEGX ENDSSEGX ENDS;SEGY SEGMENTSEGY SEGMENTSEGY SEGMENTSEGY SEGMENT CALL SUBT SEGY ENDSSEGY ENDS1/31/20235ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章6.1.3 6.1.3 保护现场和恢复现场保护现场和恢复现场例如:若子程序例如:若子程序例如:若子程序例如:若子程序PROGPROG中改变了寄存器中改变了寄存器中改变了寄存器
8、中改变了寄存器AXAX,BXBX,CXCX,DXDX的值,则的值,则的值,则的值,则 可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。PROGPROCPUSHPUSHAXAXPUSH PUSH BX BX PUSH PUSHCXCX;保护现场保护现场保护现场保护现场PUSHPUSHDXDX POPPOPDXDXPOPPOPCXCXPOPPOPBXBX;恢复现场恢复现场恢复现场恢复现场POPPOPAXAXRET;返回断点处返回断点处PROCENDP1/31/20236ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机
9、科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章6.1.4 主程序与子程序参数传递方式主程序与子程序参数传递方式 1 1 通过寄存器传送参数通过寄存器传送参数通过寄存器传送参数通过寄存器传送参数 这是最常用的一种方式,使用方便,但参数很多时不能这是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。使用这种方法。例:十进制到十六进制转换的程序。程序要求从键盘取例:十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来。示出来。开始开始调用DECIBIN调用CRLF调用BINIHE
10、X调用CRLF结束从键盘取得十进制从键盘取得十进制数,保存到数,保存到BXBX中中显示回车和换行显示回车和换行用十六进制形式用十六进制形式显示显示BXBX中的数中的数1/31/20237ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章Decihex 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
11、call call crlfcrlf call call binihexbinihex call call crlfcrlf retretMain Main endpendp Decibin Decibin proc near proc near mov bx,0Newchar: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 ,
12、ax ;结果在结果在BX中中 jmp newchar Exit:retDecibin endp Decibin endp 1/31/20238ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章Binihex Binihex proc near proc near mov chmov ch,4,4Rotate:Rotate: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
13、 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 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 e
14、ndpCrlf endpDecihex ends end repeat 1/31/20239ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章2 2如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,如果过程和调用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。则过程可直接访问模块中的变量。3 4 例例例例 6.4 6.4 6.4 6.4 主程序主程序主程序主程序MAIN
15、MAINMAINMAIN和过程和过程和过程和过程PROADDPROADDPROADDPROADD在同一源文件在同一源文件在同一源文件在同一源文件中,要求用过程中,要求用过程中,要求用过程中,要求用过程PROADDPROADDPROADDPROADD累加数组的所有元素,并把累加数组的所有元素,并把累加数组的所有元素,并把累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中和(不考虑溢出的可能性)送到指定的存储单元中和(不考虑溢出的可能性)送到指定的存储单元中和(不考虑溢出的可能性)送到指定的存储单元中去去去去1/31/202310ch6 安徽理工大学安徽理工大学 计算机科学与技术
16、系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章DATA 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 PU
17、SH AX 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 AD
18、D 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 START1/31/202311ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章CODE SEGMENTARY DW 100 DUP(?)ARY DW 100 DUP(?)COUNT DW 100COU
19、NT 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 CALL PROADD PROADD ;计算计算计算计算SUMSU
20、MPROADD PROC NEAR PUSH AX PUSH CX PUSH SI MOV SI,MOV SI,MOV 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 安徽理工大学安徽理工大
21、学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章例:把内存中字变量例:把内存中字变量例:把内存中字变量例:把内存中字变量numnum的值,的值,的值,的值,转换为转换为转换为转换为4 4个用个用个用个用ASCASC码表示的码表示的码表示的码表示的1616进制数码,串的起始地址为进制数码,串的起始地址为进制数码,串的起始地址为进制数码,串的起始地址为stringstring 。Data segmentNum dw 25afhString db 4 dup(?),$,0dh,0ahData endsStack segment para stack stack
22、db 100 dup(?)Stack endsCode segment assume cs:code,ds:data,ss:stackMain proc farBegin:push ds xor ax,ax push ax mov 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:00
23、043000:00073000:00093000:000d3000:000e3000:00123000:00153000:001915150000af250200spstring地址地址NumLea dx,string地址(地址(IP)4 4 通过堆栈传递地址或参数通过堆栈传递地址或参数1/31/202313ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章Binhex Binhex proc nearproc near push bp mov bp,sp push ax push di push bx push cx push
24、f 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地址地址NumLea dx,string地址地址(IP)flagcxbxdiaxbp(Sp)bpbp+2bp+4bp+6Bp-6Bp-4Bp-21/31/202314ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第
25、6 6章章Next: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 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章 例例例例3 3:求:求:求:求1010个数的累加值个数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 子程序结构47195 子程序 结构 47195
限制150内