子程序的嵌套_第1页
子程序的嵌套_第2页
子程序的嵌套_第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本文格式为Word版,下载可任意编辑子程序的嵌套 一、子程序的嵌套 一个子程序作为调用程序去调用另一个子程序的状况称为子程序的嵌套。 嵌套深度:嵌套的层数称为嵌套深度。不受限制。 嵌套子程序的设计:没有什么特别要求,除子程序的调用和返回应正确使用CALL和RET指令外,要留意寄存器的爱护和恢复。如用堆栈传送数据要避开因堆栈使用中的溢出问题而造成子程序不能正确返回的错误。有两种可能发生堆栈溢出的状况: 堆栈上溢:如堆栈已满,但还想再存入信息,这种状况称为堆栈上溢。 堆栈下溢:如堆栈已空,但还想再取出信息,这种状况称为堆栈下溢。 递归子程序:子程序自己调用自己的状况称为递归调用,这种子程序称为递归

2、子程序 二、嵌套深度 图1表示了嵌套深度为2时的子程序嵌套状况。 例1两个6字节数相加。 分析:将一个字节相加的程序段设计为子程序。主程序分3次调用该子程序,但每次调用的参数不同。 程序如下: DATASEGMENT ADD1DBFEH,86H,7CH,35H,68H,77H ADD2DB45H,BCH,7DH,6AH,87H,90H SUMDB6DUP(0) COUNTDB6 DATAENDS STACKSEGMENT DB100DUP(?) STACKENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK MADD:MOVAX,DATA MOVDS,

3、AX MOVAX,STACK MOVSS,AX MOVSI,OFFSETADD1 MOVDI,OFFSETADD2 MOVBX,OFFSETSUM MOVCX,COUNT;循环初值为6 CLC AGAIN:CALLSUBADD;调用子程序 LOOPAGAIN;循环调用6次 MOVAX,4C00H INT21H ;子程序入口参数:SI,DI,BX出口参数:SI,DI,BX SUBADDPROC;完成一个字节相加 PUSHAX;爱护AX的值 MOVAL,SI;SI是一个源操作数指针 ADCAL,DI;DI是另一个源操作数指针 MOVBX,AL;BX是结果操作数指针 INCSI INCDI INCB

4、X POPAX;恢复AX的值 RET SUBADDENDP CODEENDS ENDMADD 例2把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串,串的起始地址为STRING。 分析:把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串的工作设计成一个子程序,在这个子程序中再调用另一个子程序,由它完成从BCD码到ASCII码的转换。 程序如下: DATASEGMENT NUMBERDW25AFH STRINGDB4DUP(?),0DH,0AH,$ DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA BEGIN

5、:MOVAX,DATA MOVDS,AX MOVES,AX LEABX,STRING PUSHBX;将参数(结果地址指针)压入堆栈 PUSHNUMBER;将源数据压入堆栈 CALLBINHEX;调用子程序 LEADI,STRING MOVAH,9 INT21H BINHEXPROC PUSHBP MOVBP,SP PUSHAX PUSHDI PUSHCX PUSHDX PUSHF;以上为爱护现场 MOVAX,BP+4;取出NUMBER MOVDI,BP+6;取出STRING的偏移地址 ADDDI,LENGTHSTRING-1;使DI指向转换数据 MOVDX,AX;爱护原始数据 MOVCX,4

6、AGAIN:ANDAX,0FH;取低4位 CALLHEXD;调子程序 STD STOSB;爱护转换数据 PUSHCX;爱护CX的值 MOVCL,4 SHRDX,CL MOVAX,DX POPCX LOOPAGAIN POPF POPDX POPCX POPDI POPAX POPBP RET4 BINHEXENDP HEXDPROC;将AL中的BCD码转换成ASCII码 CMPAL,0AH JLADDZ ADDAL,a-0-0AH;小写字母转换成ASCII码,若为大写 ADDZ:ADDAL,0;字母,则再加ADDAL,7 RET HEXDENDP CODEENDS EDNBEGIN 例63数的

7、阶乘1 根据阶乘的定义n!=n*(n-1)! 这是一个递归定义式,可采纳子程序的的递归调用形式。程序如下: DATASEGMENT NUMDB5 FNUMDW? DATAENDS STACKSEGMENT DB100DUP(?) STACKENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK BEGIN:PUSHDS MOVAX,0 PUSHAX MOVCX,1 PUSHCX MOVAH,0 MOVAL,NUM CALLFACTOR MOVFNUM,AX POPCX MOVAX,4C00H INT21H FACTORPROC CMPAX,0 JNZIIA MOVDL,1 RET

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论