第6章 子程序结构(精品).ppt
《第6章 子程序结构(精品).ppt》由会员分享,可在线阅读,更多相关《第6章 子程序结构(精品).ppt(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章子程序结构子程序结构子程序又称为过程,相当于高级子程序又称为过程,相当于高级语言中的过程和函数,引入过程的目语言中的过程和函数,引入过程的目的是为了减少相同功能的程序段在程的是为了减少相同功能的程序段在程序中的重复出现,提高代码的可重用序中的重复出现,提高代码的可重用性,也是模块化的程序设计的基础。性,也是模块化的程序设计的基础。611过程定义伪操作过程定义伪操作过程定义的一般形式:过程定义的一般形式:过程名过程名PROC属性属性过程名过程名ENDP其中:其中:过程名为标识符,它又是子程序的入口地址,它的写法和标识符的写法相同。过程名为标识符,它又是子程序的入口地址,它的写法和标识符
2、的写法相同。属性是指类型属性,它可以是属性是指类型属性,它可以是NEAR或或FAR说明:说明:1过程是位于代码段中的子程序,由调用程序通过过程是位于代码段中的子程序,由调用程序通过CALL指令调用。指令调用。2过程的最后一个语句是过程的最后一个语句是RET语句。语句。3当调用程序和过程在同一个代码段中时,定义过程为当调用程序和过程在同一个代码段中时,定义过程为NEAR属性属性4当调用程序和过程不在同一个代码段中时,定义过程为当调用程序和过程不在同一个代码段中时,定义过程为FAR属性属性6.1子程序的设计方法子程序的设计方法例例61调用程序和子程序在同一代码段中。调用程序和子程序在同一代码段中。
3、MAINPROCFARCALLSUBR1RETMAINENDP;SUB1PROCNEARRETSUB1ENDP或定义成或定义成MAINPROCFARCALLSUBR1RET;SUB1PROCNEARRETSUB1ENDPMAINENDP也也就就是是说说,调调用用过过程程与与被被调调用用过过程程之之间间,可可以以是是的的并并列列的的定定义义形形式式,也也可可以以是是嵌嵌套套的定义形式,即一个过程定义中可以包括多个过程定义。的定义形式,即一个过程定义中可以包括多个过程定义。SEGXSEGMENTSUBTPROCFARRETSUBTENDPCALLSUBTSEGXENDS;SEGYSEGMENTCA
4、LLSUBTSEGYENDS例例62调调用用程程序序和和子子程程序序不不在在同同一代码段内一代码段内SUBT为为一一个个过过程程,它它有有两两处处被被调调用用,一一处处是是与与它它在在同同一一段段的的SEGX段段内内,另另一一处处是是在在另另一一段段SEGY段段内内,为为此此它它必必须须声声明明具具有有FAR属属性性以以适适应应SEGY段段调调用用的的需需要要。SUBT既既有有FAR属属性性,则则不不论论在在SEGX和和SEGY段段对对SUBT的的调调用用就就都都具具有有FAR属属性性了了,这这样样不不会会发发生生什什么么错错误误,反反之之,如如果果这这里里的的SUBT使使用用了了NEAR属属
5、性性,则则SEGY段段能能者者多多劳劳它它调调用用就会出错了。就会出错了。612子程序的调用和返回子程序的调用和返回过程的正确执行是由子程序的正确调用及正确返回保证的。过程的正确执行是由子程序的正确调用及正确返回保证的。调用指令调用指令CALL返回指令返回指令RET执执行行CALL时时,系系统统会会根根据据被被调调用用的的子子程程序序的的属属性性自自动动将将CALL语语句句的的下下一一语语句句地地址址压压栈栈。而而执执行行RET语语句句时时,会会从从当前栈顶中弹出返回地址更新当前栈顶中弹出返回地址更新IP或或CS:IP。因因此此,为为了了保保证证其其正正确确性性,除除PROC的的属属性性要要正
6、正确确外外,还还应应该该注注意意子子程程序序运运行行期期间间的的堆堆栈栈状状态态,如如果果在在子子程程序序中中有有对对堆堆栈栈操操作作的的语语句句,如如有有PUSH和和POP等等,但但因因其其个个数数不不等等,从从而而导导致致在在程程序序执执行行RET前前SP并并未未指指向向进进入入子子程程序序时时的的返返回回地地址址,则则必必然然会会导导致致运运行行出出错错,所所以以子子程程序序中中对对堆堆栈栈的的使使用用应应该该特特别别小小心心,以免发生错误。以免发生错误。613保存与恢复寄存器保存与恢复寄存器由由于于调调用用程程序序(又又称称主主程程序序)和和子子程程序序经经常常是是分分别别编编制制的的
7、,所所以以它它们们所所使使用用的的寄寄存存器器往往往往会会发发生生冲突。冲突。如如果果主主程程序序在在调调用用子子程程序序以以前前的的某某个个寄寄存存器器内内容容在在从从子子程程序序返返回回后后还还有有用用,而而子子程程序序又又恰恰好好使使用用了了同同一一寄寄存存器器,造造成成破破坏坏了了寄寄存存器器的的原原有有内内容容,那那就就会会造造成成程程序序运行错误,这是不允许的。运行错误,这是不允许的。为为了了避避免免这这种种错错误误的的产产生生,在在一一进进入入子子程程序序后后就就应应该该把把子子程程序序所所需需要要用用到到的的寄寄存存器器内内容容保保存存在在堆堆栈栈中中,而而在在退退出出子子程程
8、序序前前把把寄寄存存器内容恢复原状。例如:器内容恢复原状。例如:SUBTPROC NEARPUSHAXPUSHBXPUSHCXPUSHDXPOPDXPOPCXPOPBXPOPAXRETSUBTENDP在在子子程程序序设设计计时时,应应该该仔仔细细考考虑虑哪哪些些寄寄存存器器是是必必须须保保存存的的,哪些寄存器是不必要或不应该保存的。哪些寄存器是不必要或不应该保存的。一般说来,子程序中用到的寄存器是应该保存的。但是,一般说来,子程序中用到的寄存器是应该保存的。但是,如果使用寄存器来在主程序和子程序之间传送参数的话,如果使用寄存器来在主程序和子程序之间传送参数的话,这种寄存器就不一定需要保存,特别
9、是用来向主程序回送这种寄存器就不一定需要保存,特别是用来向主程序回送结果的寄存器,就更不应该保存和恢复寄存器而破坏了应结果的寄存器,就更不应该保存和恢复寄存器而破坏了应该向主程序传送的信息。该向主程序传送的信息。614子程序的变量传送子程序的变量传送调调用用程程序序在在调调用用子子程程序序时时经经常常需需要要传传送送一一些些参参数数给给子子程程序序;子子程程序序运运行行完完成成后后也也经经常常要要回回送送一一些些信信息息给给调调用用程程序序。这这种种调调用用程程序序和和子子程程序序之之间间的的信信息息传传送送称称为为变变量量传传送送(或或称称为为参参数数传传送送或或过程通信)。变量传送方式有以
10、下几种:过程通信)。变量传送方式有以下几种:1.通过寄存器传送参数;通过寄存器传送参数;2.如如果果过过程程和和调调用用程程序序在在同同一一程程序序模模块块中中,则则直直接接访访问问模模块块中中的变量;的变量;3.通过地址表传送参数地址;通过地址表传送参数地址;4.通过堆栈传送参数或参数地址;通过堆栈传送参数或参数地址;5.多多个个模模块块之之间间的的参参数数传传送送问问题题可可通通过过对对引引用用符符号号的的说说明明后后在在连接过程中解决。连接过程中解决。1.通过通过寄存器传送变量寄存器传送变量例例6.3十十进进制制到到十十六六进进制制数数转转换换程程序序。程程序序要要求求从从键键盘盘取取得
11、得一一个个十十进进制制数数,然然后后把把该该数数以以十十六六进进制制形形式式在在屏幕上显示出来。屏幕上显示出来。程序结构程序结构开始通用DECIBIN通用CRLF通用BINIHEX通用CRLF结束从键盘收得十进制数保存在BX中显示回车换行用十六制数形式显示BX中的数;DECIHEX-主程序主程序;将键盘输入的十进制数转换成十六进制数送屏幕输出将键盘输入的十进制数转换成十六进制数送屏幕输出decihex segmentassumecs:decihex;程序的主要内容程序的主要内容,包括过程包括过程mainprocfarrepeat:calldecibin;将键盘所送的十进制数转换成二进制数存入将
12、键盘所送的十进制数转换成二进制数存入BXcallcrlf;屏幕输出回车换行屏幕输出回车换行ANDBX,BXJZDONEcallbinihex;将将BX中的二进制数转换成十六进制数送屏幕输出中的二进制数转换成十六进制数送屏幕输出callcrlf;屏幕输出回车换行屏幕输出回车换行jmprepeatDONE:MOVAX,4C00HINT21Hmainendp;过程名过程名:DECIBIN:DECIBIN;功能功能 :将键盘所送的十进制数转换成二进制数将键盘所送的十进制数转换成二进制数;出口出口 :转换结果在转换结果在BXBX寄存器中寄存器中decibindecibin proc procnearne
13、armovmovbx,0 ;BXbx,0 ;BX赋初值赋初值;从键盘读得十进制数字从键盘读得十进制数字,转换成二进制数转换成二进制数newchar:movnewchar:movah,1 ah,1 ;读键盘系统调用读键盘系统调用,ASCII,ASCII在在ALAL中中intint21h21hsubsubal,30h ;al,30h ;转换成数字转换成数字0-90-9的二进制数的二进制数jljlexitexitcmpcmpal,9dal,9djgjgexitexitcbwcbw ;扩充到一个字扩充到一个字,刚才输入的一位数字现在刚才输入的一位数字现在AXAX寄存器中寄存器中;将将BXBX中的中间结
14、果乘以中的中间结果乘以1010 xchgxchgax,bxax,bx;取上次的中间结果到取上次的中间结果到AX,AX,本次输入数转换结果到了本次输入数转换结果到了BXBXmovmovcx,10d ;cx,10d ;中间结果中间结果*1010mulmulcxcxxchgxchgax,bxax,bx ;结果暂存结果暂存BXBX中中,AX,AX为本次输入数的转换结果为本次输入数的转换结果;再加上再加上AXAX中刚转换的一位十进制数中刚转换的一位十进制数addaddbx,axbx,ax ;中间结果中间结果*10+d,10+d,结果存入结果存入BXBXjmpjmpnewcharnewcharexit:e
15、xit:retretdecibindecibin endpendp;过程名过程名:BINIHEX:BINIHEX;功能功能 :将将BXBX中的二进制数转换成十六进制数送屏幕输出中的二进制数转换成十六进制数送屏幕输出;入口入口 :BX:BX中有待转换的二进制数中有待转换的二进制数binihexbinihex proc procnearnearmovmovch,4ch,4;数据位数数据位数rotate:rotate:movmovcl,4cl,4;循环移位次数循环移位次数rolrolbx,clbx,cl;向左循环移位向左循环移位,将高四位移到低四位将高四位移到低四位movmoval,blal,bl;
16、取低字节到取低字节到ALALandandal,0fhal,0fh;屏蔽高四位屏蔽高四位,截取低四位截取低四位addaddal,30hal,30h;加加30H,30H,转换成十进制数的转换成十进制数的ASCIIASCIIcmpcmpal,3ahal,3ah;jljlprint print addaddal,7hal,7h;如果是十六进制数如果是十六进制数A-F,A-F,则再加则再加7 7print:print:movmovdl,aldl,al;转存到转存到DLDLmovmovah,2ah,2;显示功能调用显示功能调用intint21h21h;decdecchch ;位数减位数减1 1jnzjnz
17、rotate ;rotate ;非非0 0则转换完则转换完,继续继续retret;返回返回binihexbinihex endpendp ;过程名过程名:CRLF;功能功能:输出回车换行输出回车换行crlfprocnearmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendpdecihex endsendmain2.如子程序和调用程序在同一个源文件中,则可以直接访问模块中的变量如子程序和调用程序在同一个源文件中,则可以直接访问模块中的变量例例6.4主程序主程序MAIN和过程和过程PROADD在同一源文件中,要求用过程在同一源文件中,要求用
18、过程PROADD累加数组中的所有元素,并把和(不考虑溢出的可能性)累加数组中的所有元素,并把和(不考虑溢出的可能性)送到指定存储单元中去。送到指定存储单元中去。datasegment;定义数据段定义数据段arydw100,200,300,400,9000;其和为十进制数其和为十进制数10000十六进制数十六进制数2710Hcountdw($-ary)/2;数据个数数据个数sumdw?;和存放单元和存放单元dataendscodesegment;定义代码段定义代码段mainprocfarassumecs:code,ds:datastart:pushdssubax,ax;建立返回堆栈建立返回堆栈p
19、ushaxmovax,data;DS指向数据段指向数据段movds,axcallnearptrproadd;调用调用proadd子程序子程序movbx,sumcallbinihex;将和输出显示将和输出显示retmainendpproaddprocnearpushax;保护寄存器保护寄存器pushcxpushsileasi,ary;SI置为数组首址置为数组首址movcx,count;CX为数组长度为数组长度xorax,ax;累加器清累加器清0next:addax,si;相加相加addsi,2;SI指向下一数指向下一数loopnext;未完继续未完继续movsum,ax;存和存和popsipop
20、cxpopax;恢复寄存器恢复寄存器retproaddendp;功能功能:将将BX的内容按的内容按4位十六进制数格式位十六进制数格式输出输出;入口条件入口条件:BX中存放待输出的数据中存放待输出的数据binihexprocnearpushax;保护寄存器保护寄存器pushcxpushdxmovch,4;数据位数数据位数rotate:movcl,4;循环移位次数循环移位次数rolbx,cl;向左循环移位向左循环移位,将高四位移到低四位将高四位移到低四位moval,bl;取低字节到取低字节到ALandal,0fh;屏蔽高四位屏蔽高四位,截取低四位截取低四位addal,30h;加加30H,转换成十进
21、制数的转换成十进制数的ASCIIcmpal,3ah;jlprintaddal,7h;如果是十六进制数如果是十六进制数A-F,则再加则再加7print:movdl,al;转存到转存到DLmovah,2;显示功能调用显示功能调用int21h;decch;位数减位数减1jnzrotate;非非0则转换完则转换完,继续继续popdxpopcxpopax;恢复寄存器恢复寄存器ret;返回返回binihexendp;codeendsendstart除此以外,还可以通过地址表传送参数地址和通过堆栈传送参数或参数地址。除此以外,还可以通过地址表传送参数地址和通过堆栈传送参数或参数地址。3.多个模块之间的参数传
22、送问题多个模块之间的参数传送问题 多个模块和程序之间的参数连接时,并不一定要把所有的代码段或数据段放在一起形多个模块和程序之间的参数连接时,并不一定要把所有的代码段或数据段放在一起形成一个大代码段。通常,各程序模块可有各自的分段,通过模块之间的调用来进行工作。成一个大代码段。通常,各程序模块可有各自的分段,通过模块之间的调用来进行工作。(1)外部符号)外部符号在某一个模块中定义,而在另一个模块中引用的符号称为外部符号,在某一个模块中定义,而在另一个模块中引用的符号称为外部符号,包括变量,标号,过程名等。包括变量,标号,过程名等。相对而言,在本模块中定义又在本模块中引用的符号称为局部符号。相对而
23、言,在本模块中定义又在本模块中引用的符号称为局部符号。有两个伪操作与外部符号有关。有两个伪操作与外部符号有关。PUBLIC伪伪操作:操作:格式:格式:PUBLICsymbol,.作用:用于说明本模供其他模块调用的符号。作用:用于说明本模供其他模块调用的符号。EXTRN伪操作:伪操作:格式:格式:EXTRNsymbolname:type,.其中,其中,type对变量而言可以是对变量而言可以是byte,word,dword等,等,而对标号而言,可以是而对标号而言,可以是near或或far。作用:用于说明本模供要引用的在其他模块定义的符号。作用:用于说明本模供要引用的在其他模块定义的符号。这两个伪操
24、作就提供了模块之间相互访问的可能性。使用时,要注意两者的匹配。这两个伪操作就提供了模块之间相互访问的可能性。使用时,要注意两者的匹配。例例6.5三个模块中的外部符号定义。三个模块中的外部符号定义。;sourcemodule1extrn var2:word,lab2:farpublic var1,var4,lab1data1 segmentvar1 db?var3 dw?var4 dw?data1 endscode1 segmentassumecs:code1,ds:data1main proc farstart:mov ax,data1mov ds,ax;.lab1:;.mov ax,4c00
25、hint21hmain endpcode1 endsend start;sourcemodule2extrnvar1:byte,var4:wordpublicvar2data2segmentvar2dw0var3db5dup(?)data2endscode2segmentassumecs:code2,ds:data2;.code2endsend;sourcemodule3;extrnlab1:farpubliclab2,lab3;code3segmentassumecs:code3;.lab2:movax,1234h;.lab3:pushax;.code3endsend;例例6.9HEXIDE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 子程序结构精品 子程序 结构 精品
限制150内