第6章 子程序结构47195.ppt

上传人:hyn****60 文档编号:70969511 上传时间:2023-01-31 格式:PPT 页数:42 大小:177KB
返回 下载 相关 举报
第6章 子程序结构47195.ppt_第1页
第1页 / 共42页
第6章 子程序结构47195.ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《第6章 子程序结构47195.ppt》由会员分享,可在线阅读,更多相关《第6章 子程序结构47195.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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个数的累加值个数

26、的累加值个数的累加值个数的累加值.-远调用远调用远调用远调用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 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬

27、兆李敬兆 汇编语言汇编语言第第6 6章章 Mov bx,offset 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/202317ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆

28、李敬兆 汇编语言汇编语言第第6 6章章Sum地址地址Count地址地址Ary地址地址spMOV AL,SUM 地址地址disicxaxbp(Sp)bpIPCSCode2 segment 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

29、pop di pop si pop cx pop ax pop bp ret 6ret 6Proadd endpCode2 ends end startbp+0ahbp+08hbp+06h1/31/202318ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章(1)(1)PUBLICPUBLIC伪指令伪指令 格式:格式:PUBLIC PUBLIC PUBLIC PUBLIC 符号符号符号符号 ,符号,符号,符号,符号 功功能能:说说明明其其后后的的符符号号是是全全局局符符号号。全全局局符符号号能能被被其其他他模模块引用。块引用。

30、(局部符号)局部符号)(2)(2)EXTRNEXTRN伪指令伪指令 格式:格式:EXTRN EXTRN EXTRN EXTRN 符号:类型符号:类型符号:类型符号:类型 ,符号:类型,符号:类型,符号:类型,符号:类型 功功能能:说说明明在在本本模模块块中中需需要要引引用用的的、由由其其他他模模块块定定义义的的符符号,即外部符号号,即外部符号。5 5 多个模块之间的参数传送问题多个模块之间的参数传送问题多个模块之间的参数传送问题多个模块之间的参数传送问题1/31/202319ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章so

31、urce module 1source module 1 extrn extrn a:worda:word Data1 segmentData1 segment b b dw dw?Data1 ends Data1 ends code1 segment code1 segment assume assume cs cs:code1,:code1,dsds:data1:data1Main proc farMain proc far start:start:mov mov ax,data1ax,data1 mov ds mov ds,ax,ax mov mov ah,4chah,4ch int i

32、nt 21h21hMainMain endp endpCode1 ends Code1 ends End startEnd startsource module 2source module 2 public apublic a Data2 segmentData2 segment a a dw dw?Data2 ends Data2 ends code2 segment code2 segment assume assume cs cs:code2,:code2,dsds:data2:data2Main proc farMain proc far start:start:mov mov ax

33、,data2ax,data2 mov ds mov ds,ax,ax mov mov ah,4chah,4ch int int 21h21hMainMain endp endpCode2 ends Code2 ends End startEnd start注意:注意:应先有应先有应先有应先有public public public public 定义,然后才有定义,然后才有定义,然后才有定义,然后才有extrnextrnextrnextrn说明说明说明说明1/31/202320ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章N

34、AMEMOD1EXTRNEXTRNDISPDISP:FARFARPUBLICPUBLICSTR1STR1,N N,BUFBUFDATA1SEGMENTSTR1DBHOW DO YOU DO?N=$-STR1BUFDBTHIS IS AN EXAMPLE OF MODULES PROGRAM DATAENDSSTACKSEGMENT STACKDB 200 DUP(0)STACKENDSCODE1SEGMENTASSUME CS:CODE1,DS:DATA1,SS:STACKSTART:MOVAX,DATAMOVDS,AXCALLCALLDISPDISPMOVAH,4CHINT21HCODE1E

35、NDS ENDSTART例:用模块化程序设计方法建立两个模块例:用模块化程序设计方法建立两个模块MOD1 ASMMOD1 ASM和和MOD2 ASMMOD2 ASM的数据通讯。的数据通讯。1/31/202321ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章NAMEMOD2EXTRNEXTRNSTR1STR1:BYTEBYTE,STR2STR2:BYTEBYTE,N N:ABSABSPUBCICPUBCIC DISPDISPDATA2SEGMENTSTR2DB 81 DUP(0)DATA2ENDSCODE2SEGMENTASS

36、UME CS:CODE2,ES:DATA2DISPDISPPROCPROCFARFARMOVAX,DATA2MOVES,AXLEALEABXBX,STR1STR1MOVCX,NLEASI,STR2NEXT:MOVAL,BXMOVES:SI,ALINCBXINCSI LOOPNEXTLEADX,BUFMOVAH,9INT21HRET DISPDISPENDPENDPCODE2ENDSEND1/31/202322ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章6.1.5 6.1.5 增强功能的过程定义伪操作增强功能的过程定义伪操作

37、Procname Procname Procname Procname PROC PROC PROC PROC attributes field attributes field attributes field attributes field USERUSERUSERUSER register list register list register list register list ,parameter field ,parameter field ,parameter field ,parameter field Procname Procname Procname Procname

38、 ENDPENDPENDPENDPAttributes field(Attributes field(Attributes field(Attributes field(属性字段)属性字段)属性字段)属性字段)包括:包括:DistanceDistanceDistanceDistance:near near near near 、farfarfarfar Language type Language type Language type Language type:说明是那种高级语言的子程序说明是那种高级语言的子程序 如如pascalpascalpascalpascal 、c c c c 等。等

39、。VisibilityVisibilityVisibilityVisibility :说明程序的可见性说明程序的可见性 是是privateprivateprivateprivate 或是或是publicpublicpublicpublic。Prologue Prologue Prologue Prologue:是一个是一个宏的名字宏的名字宏的名字宏的名字,允许用宏来控制过程的入口或出口有关的代码,允许用宏来控制过程的入口或出口有关的代码USERUSERUSERUSER:该字段用来该字段用来指定用户所需保存和恢复的寄存器表指定用户所需保存和恢复的寄存器表指定用户所需保存和恢复的寄存器表指定用户所

40、需保存和恢复的寄存器表。Parameter fieldParameter fieldParameter fieldParameter field:参数字段参数字段 ,允许用户指定该过程所用的参数允许用户指定该过程所用的参数允许用户指定该过程所用的参数允许用户指定该过程所用的参数 。标识符:类型标识符:类型标识符:类型标识符:类型 ,标识符:类型,标识符:类型,标识符:类型,标识符:类型 1/31/202323ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章Data segmentAry db 10 dup(?)Count db

41、 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,ax Mov bx,offset ary Push bx Mov bx,offset count Push bx Mov bx,offset sum Push bx Call farCall far ptr proadd ptr pr

42、oadd mov al,sum mov dl,al mov ah,2 int 21h retMain endpCode1 ends例例6.4 用增强功能过程定义伪操作实现用增强功能过程定义伪操作实现 1/31/202324ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章Code2 segment 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,

43、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 startCode2 segment assume cs:code2Proadd Proadd procproc pascalpascal useruser axax cx si di cx si di,parapara:wordword,parcparc:wordword,p

44、arspars:wordword mov si,para mov di,parc mov cl,di mov di,pars xor al,alAgain:add al,si inc si dec cl jnz again mov di,al ret ret Proadd endpCode2 ends end startSumSum地址地址地址地址CountCount地址地址地址地址AryAry地址地址地址地址(bp)IPCS(bp+2)(bp+4)(bp+6)(bp+8)(bpbp +a+a)原始原始bpmov al,sum parapara parsparsparcparc局部局部局部局部

45、变量变量变量变量disicxax(bp-2)1/31/202325ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章 增强功能的过程定义伪操作除了以上功能外增强功能的过程定义伪操作除了以上功能外 ,还可以在还可以在还可以在还可以在过程中定义局部变量过程中定义局部变量过程中定义局部变量过程中定义局部变量。局部变量是在过程内部使用的变量,局部变量是在过程内部使用的变量,局部变量是在过程内部使用的变量,局部变量是在过程内部使用的变量,他是在过程调用是在堆栈中建立的,在退出过程是被释放他是在过程调用是在堆栈中建立的,在退出过程是被释放他

46、是在过程调用是在堆栈中建立的,在退出过程是被释放他是在过程调用是在堆栈中建立的,在退出过程是被释放。可以用可以用 LOCAL LOCAL 定义定义 LOCAL LOCAL LOCAL LOCAL 变量:类型变量:类型变量:类型变量:类型 ,变量:类型,变量:类型,变量:类型,变量:类型 Sum地址地址Count地址地址Ary地址地址(bp)IPCS(bp+2)(bp+4)(bp+6)(bp+8)(bp+a)原始原始bp(bp-2)(bp-4)局部局部局部局部变量变量变量变量1/31/202326ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语

47、言第第6 6章章6.2 子程序的嵌套子程序的嵌套 一个子程序可以作为调用程序去掉用另一个子程序,这种一个子程序可以作为调用程序去掉用另一个子程序,这种一个子程序可以作为调用程序去掉用另一个子程序,这种一个子程序可以作为调用程序去掉用另一个子程序,这种情况称为子程序的嵌套情况称为子程序的嵌套情况称为子程序的嵌套情况称为子程序的嵌套。嵌套深度不限。嵌套深度不限。但应注意什么问题?但应注意什么问题?堆栈溢出:上溢、下溢堆栈溢出:上溢、下溢递归子程序:递归子程序:如果一个子程序调用的是子程序的本身,就是递如果一个子程序调用的是子程序的本身,就是递 归子程序。归子程序。1/31/202327ch6 安徽

48、理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章 例例例例5:5:计算计算计算计算 N!=N*(N-1)*(N-2)*1N!=N*(N-1)*(N-2)*1 -递归子程序递归子程序递归子程序递归子程序Data segmentNum db 3Result dw?Data endsStack segment para stack stack db 100 dup(?)Stack endsCode segment assume cs:code,ds:data,ss:stackMain proc farMain proc farBegin:pus

49、h ds xor ax,ax push ax mov ax,data mov ds,ax1/31/202328ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章 mov ah,0 mov al,num call factorcall factor mov result,ax retMain Main endpendpFactor procFactor proc push ax sub ax,1 jne f_cont pop ax jmp returnf_cont:call factorcall factor pop cx mul

50、 clreturn:retfactor factor endpendpCode ends end beginIP1Mov result,ax 地址地址3IP2Pop cx 地址地址2IP3Pop cx 地址地址1ax=1IP POP CX 地址地址cx=2ax*cx=1*2IP POP CX 地址地址cx=3ax*cx=1*2*3IP Mov result,ax 地址地址1/31/202329ch6 安徽理工大学安徽理工大学 计算机科学与技术系计算机科学与技术系 李敬兆李敬兆 汇编语言汇编语言第第6 6章章 常用的DOS系统功能调用1单字符输入(单字符输入(1号调用)号调用)2单字符显示(单字

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁