




已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6 1子程序的调用与返回指令 6 1 1子程序的调用指令CALL6 1 2返回指令RET 下一节 6 1 1子程序的调用指令CALL 指令格式 CALLOPD注 过程名或子程序名就是子程序入口处的符号地址 执行CALL指令时 首先要保留断点地址于堆栈中 然后程序转移到指定的子程序入口地址处去执行子程序 由于子程序与调用它的程序可能在同一个段中 也可以不在同一个段中 CALL指令在转移到子程序入口地址时有两种寻址方式 直接寻址方式和间接寻址方式或者称为直接调用和间接调用 前面提到 指令指针寄存器IP总是指向下一条将要执行的指令 在执行指令CALL时 堆栈中保存的就是原程序的断点地址 CALL指令后面1条指令的地址称为断点地址 也即返回地址 1 段内直接调用 在调用指令的目的操作数中直接给出过程名或子程序名 如CALLPROC1执行的操作 SP SP 2 SP 1 SP IP IP IP 16位的位移量指令中的过程名或子程序名为NEAR属性 给出了转向地址 即子程序的入口地址 亦子程序的第一条指令的地址 例6 1 CALLDISPLAY1 DISPLAY1PROCNEAR RET 2 段内的间接调用 子程序的入口地址存放在一个16位通用寄存器或字存储单元中 在调用指令的目的操作数是除立即数寻址的某种寻址方式确定的有效地址EA 执行的操作是 SP SP 2 SP 1 SP IP IP EA 例6 2 CALLBX CALLWORDPTR BX 3 段间直接调用 调用指令的目的操作数中直接给出过程名或子程序名 如 CALLPROC2注 在不同的逻辑段中进行调用 直接调用的属性为FAR类型 执行的操作 SP SP 2 SP 1 SP CS IP EA SP SP 2 SP 1 SP IP IP 偏移地址 CS 子程序的段基址 例6 3 CALLDISPLAY2 DISPLAY2PROCFAR RET 4 段内间接调用 子程序的入口地址存放在一个双字存储单元中 低地址的字单元存放入口地址的偏移量 高地址的字单元存放入口地址的段基址 执行的操作 SP SP 2 SP 1 SP CS IP EA SP SP 2 SP 1 SP IP IP EA CS EA 2 例6 4 CALLDWORDPTR BX 返回本章首 6 1 2返回指令RET RET指令放在子程序的末尾 它使子程序的功能完成后返回到调用程序继续执行 而返回地址是调用指令时存入堆栈中的 回此RET指令的操作就是返回IP寄存器和CS寄存器的值 语句格式 RET执行段内RET指令时 从堆栈顶部弹出一个字 返回地址 送IP 执行段间RET指令时 从堆栈顶部弹出两个字 返回地址 分别送入IP和CS中 语句格式 RETn n为偶数 指令中参数N应为偶数 如 2 4 6等 此指令先从堆顶弹出返回地址送IP或者IP和CS中 然后用参数N修改堆栈指针SP的值 SP SP N根据调用的不同 返回指令也分为 1 段内返回执行的操作 IP SP 1 SP SP SP 22 段内带立即数返回RETN执行的操作 IP SP 1 SP SP SP 2 SP SP N 返回本章首 6 2子程序的设计方法 6 2 1子程序的定义6 2 2子程序的调用与返回6 2 3信息的保存与恢复 下一节 6 2 1子程序的定义 子程序的定义是由过程定义伪指令PROC和ENDP来完成的 其格式如下 过程名PROC NEAR FAR 过程名ENDP其中PROC表示过程定义开始 ENDP表示过程定义结束 过程名是过程入口地址的符号表示 一般过程名同标号一样 具有三种属性 即段属性 偏移地址属性以及类型属性 当子程序和调用程序在同一个段时 子程序定义为NEAR属性 当子程序和调用程序不在同一个段时 子程序定义为FAR属性 例6 5 主程序和子程序在同一个代码段时的调用和定义CODESEGMENT MAINPROCFAR CALLSUBPROG1 RETMAINENDP 这一条指令也可以写在子程序结束之后SUBPROG1PROCNEAR RETSUBPROG1ENDPCODEENDS 例6 6 主程序和子程序不在同一个代码段时的调用和定义CODESEGMENT MAINPROCFAR CALLSUBPROG1 RETMAINENDPCODE1SEGMENTSUBPROG1PROCNEAR RETSUBPROG1ENDPCODE1ENDS 返回本章首 6 2 2子程序的调用与返回 子程序的正确执行是由子程序的正确调用和正确返回保证的 汇编语言中子程序的调用指令CALL和返回指令RET来完成调用和返回功能 在前面学习CALL和RET指令时 在调用子程序时要把返回地址入堆栈 在返回时要把返回地址出栈 因此在子程序的设计中一定要特别注意堆栈的使用 返回本章首 6 2 3信息的保存与恢复 由于主程序和子程序都具有相互独立的属性 而CPU中的寄存器是共用的 因此主程序和子程序在使用寄存器时有可能会发生冲突 也就是说主程序在调用子程序之前的某一个寄存器中的内容在从子程序返回后还要使用 而该寄存器在子程序中恰好被使用过 这样执行完子程序 相应的寄存器的内容就被改变 不是调用前主程序中该寄存器中原有的内容 从而当子程序执行完成后返回主程序执行时 主程序执行错误 为了避免类似这种错误 需要在进入子程序时 将子程序中涉及到主程序中的相应的寄存器内容进行保护 而在退出子程序之前恢复到原寄存器中 称这个为现场进行保护 例6 7 若子程序PROG中改变了寄存器AX BX CX DX的值 则可采用如下方法保护和恢复现场 PROGPROCPUSHAXPUSHBXPUSHCX 保护现场PUSHDX POPDXPOPCXPOPBX 恢复现场POPAXRET 返回断点处PROCENDP 返回本章首 6 3主程序与子程序参数传递方式 6 3 1寄存器法6 3 2用参数表传递参数6 3 3堆栈法 下一节 6 3主程序与子程序参数传递方式 调用程序在调用子程序时 经常需要向子程序传递一些参数 子程序运行结束后 有时候也需要向调用程序返回一些数据 这种在调用程序和子程序之间的信息的传递称为参数的传递 也中变量的传递 汇编语言中 参数的传递方式有 6 3 1寄存器法 此种方法 多用于参数较少的情况 其方法就是将要传递的参数放入指定的寄存器中 然后在子程序中再从指定的寄存器中将参数读出 例6 8 从键盘输入一个十进制数 判断它的奇偶性 若为偶 在屏幕上显示 0 若为奇 则显示 1 程序中用寄存器BL进行参数的传递 CODESEGMENTASSUMECS CODESTART MOVAH 01HINT21HCLCRCRAL 1JNCEVNMOVAL 31HMOVBL ALCALLDISP EVN MOVAL 30HMOVBL ALCALLDISPMOVAH 4CHINT21HDISPPROCNEARMOVAH 02HMOVDL 0AHINT21H MOVDL 0DHINT21HMOVDL BLINT21HRETDISPENDPCODEENDSENDSTART 返回本章首 6 3 2用参数表传递参数 这种参数传递方式通过定义一组连续的存储单元 即参数来进行参数的传递 将要传送的参数存放在参数表相应的存储单元内 然后把参数表的首地址通过BX寄存器传送到子程序中去 子程序通过访问参数表中相应的存储单元来获取所需的参数 返回本章首页 例6 9 例6 9 定义两个长度相同的数组A1 A2分别对两个数组求和 求差 并将结果保存数组A3 A4中 DATASEGMENTA1DB24 35 67 45 89 90 99LENEQU A1 A2DB22 30 45 34 12 2 6A3DBLENDUP A4DBLENDUP TABLEDW0 0 0 0 0DATAENDS CODESEGMENTASSUEMCS CODE DS DATMAINPROCFARPUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AXMOVTABLE OFFSETA1MOVTABLE 2 OFFSETA2MOVTABLE 4 LENMOVTABLE 6 A3MOVTABLE 8 A4 LEABX TABLECALLADDA3CALLSUBA4RETMAINENDPADDA3PROCNEARPUSHAXPUSHCXPUSHSIPUSHDIMOVCX BX 4 T1 MOVAL BX ADDAL BX 2 MOV BX 6 ALDECCXINCBXCMPCX 0JNZT1 POPDIPOPSIPOPCXPOPAXRETADDA3ENDPSUBA4PROCNEARPUSHAXPUSHCXPUSHSIPUSHDIMOVCX BX 4 T1 MOVAL BX SUBAL BX 2 MOV BX 8 ALDECCXINCBXCMPCX 0JNZT1POPDIPOPSIPOPCXPOPAXRETSUBA4ENDPCODEENDSENDMAIN 返回本章首 6 3 3堆栈法 此种方法适用于参数多 子程序嵌套调用和递归调用的情况 使用方法是调用程序在被调用子程序之前将参数压入堆栈 子程序从堆栈中取得参数 例6 10 例6 10 在数据段中存放着某班的三门课的成绩 求每门课的最高分 并分别存入到三个单无中 DATASEGMENTSCORE1DB91 62 63 84 76 76 78 55 64 64LEN1EQU SCORE1SCORE2DB66 64 64 65 45 62 77 89 99 69LEN2EQU SCORE2SCORE3DB77 88 92 63 21 64 83 88 81 53LEN3EQU SCORE3MAX1DB MAX2DB MAX3DB DATAENDSSTACKSEGMENTTABLEDW9DUP TOPLABELWORDSTACKENDSCODESEGMENTASSUMECS CODE DS DATA SS STACKMAINPROCFARSTART MOVAX STACKMOVSS AXPUSHSSMOVAX DATAMOVDS AXXORAX AX MOVSP OFFSETTOPPUSHAXMOVBX OFFSETSCORE1PUSHBXMOVBX OFFSETMAX1PUSHBXMOVDX LEN1PUSHDXMOVBX OFFSETSCORE2PUSHBXMOVBX OFFSETMAX2PUSHBXMOVDX LEN2PUSHDXMOVBX OFFSETSCORE3PUSHBXMOVBX OFFSETMAX3 PUSHBXMOVDX LEN3PUSHDXCALLPROCMAXCALLPROCMAXCALLPROCMAXPOPAXPOPDSPOPSSRETMAINENDPPROCMAXPROCNEARPOPCXPOPDIPOPBX T1 CMPAL BX JAET2XCHGAL BX T2 INCBXLOOPT1MOV DI ALRETPROCMAXENDPCODEENDSENDSTART 返回本章首 6 4子程序的嵌套与递归调用 6 4 1子程序的嵌套6 4 2子程序的递归调用 下一节 6 4 1子程序的嵌套 子程序不但可以被主程序调用 而且也可以被其他子程序调用 把一个子程序调用另一个子程序称为子程序的嵌套调用 子程序的嵌套调用示意图 返回本章首 例6 11 例6 11 要求从键盘接受本班同学的某科成绩 并按成绩排名输出学生学号 最多为50个人 程序的嵌套调用过程为 图6 1 图6 1 图6 1 图6 1 图6 1 图6 1 图6 1 图6 1 图6 1 程序代码为 DATASEGMENTGRADEDW50DUP RANKDW50DUP COUNTDW MESS1DB GRADE MESS2DB13 10 INPUTERROR 13 10 MESS3DB RANK DATAENDSCODESEGMENTASSUMECS CODE DS DATAMAINPROCFAR START PUSHDSSUBAX AXPUSHAXMOVAX DATAMOVDS AXCALLINPUTCALLRANKPCALLOUTPUTRETMAINENDPINPUTPROCNEARLEADX MESS1MOVAH 09HINT21HMOVSI 0 MOVCOUNT 0ENTER CALLDECIBININCCOUNTCMPDL JESTORECMPDL 13JEEXIT2JNEERRORSTORE MOVGRADE SI BXADDSI 2MOVDL 00HMOVAH 02HINT21HJMPENTER ERROR LEADX MESS2MOVAH 09INT21HEXIT2 MOVGRADE SI BXCALLCRLFRETINPUTENDPRANKPPROCNEARMOVDI COUNTMOVBX 0LOOP1 MOVAX GRADE BX MOVWORDPTRRANK BX 0MOVCX COUNTLEASI GRADE NEXT CMPAX SI JGNO COUNTINCWORDPTRRANK BX NO COUNT ADDSI 2LOOPNEXTADDBX 2DECDIJNELOOP1RETRANKPENDPOUTPUTPROCNEAR LEADX MESS3MOVAH 09INT21HMOVSI 0MOVDI COUNTNEXT1 MOVBX RANK SI CALLBINIDECMOVDL MOVAH 02INT21HADDSI 2DECDIJNZNEXT1CALLCRLFRET OUTPUTENDPDECIBINPROCNEARMOVBX 0NEWCHAR MOVAH 1INT21HMOVDL ALSUBAL 30HJLEXIT1CMPAL 9DJGEXIT1CBWXCHGAX BXMOVCX 10DMULCXXCHGAX BXADDBX AXJMPNEWCHAR XIT1 RETDECIBINENDPBINIDECPROCNEARPUSHBXPUSHCXPUSHSIPUSHDIMOVCX 100DCALLDEC DIVMOVCX 10DCALLDEC DIVMOVCX 1DCALLDEC DIVPOPDIPOPSIPOPCXPOPBXRET BINIDECENDPDEC DIVPROCNEARMOVAX BXMOVDX 0DIVCXMOVBX DXMOVDL ALADDDL 30HMOVAH 02HINT21HRETDEC DIVENDPCRLFPROCNEAR MOVDL 0AHMOVAH 02INT21HMOVDL 0DHMOVAH 02INT21HRETCRLFENDPCODEENDSENDSTART 返回本章首 6 4 2子程序的递归调用 子程序的递归调用是指一个子程序直接或间接地调用自己 递归子程序一般对应于数学上对函数的递归定义 它往往能设计出效率较高的程序 完成相当复杂的计算 因而是很有用的 例6 12 例6 12 试编制计算N N 0 的程序 N N N 1 N 2 1其递归定义如下 0 1N N N 1 N 1 例4 16 STACKSEGMENTSTACKDB200DUP 0 STACKENDSDATASEGMENTNDW5RESULTDW DATAENDSCODESEGMENTASSUMECS CODE SS STACK DS DATASTART MOVAX DATA MOVDS AXMOVAX NCALLFACTMOVAX RESULTMOVAH 4CHINT21HFACTPROCCMPAX 0JNEL1MOVRESULT 1JMPEXIT L1 PUSHAXDECAXCALLFACTPOPAXMOVRESULTMOVRESNLT AXEXIT RETFACTENDPCODEENDSENDSTART 返回本章首 6 5子程序应用举例 例6 13 将一个给定的二进制数按位转换成相应的ASCII码字符串 送到指定的存储单元并显示 如二进制数10010011转换成字符串为 10010011 要求将转换过程写成子程序 且子程序应具有较好的通用性 而必须能实现对8倍和16倍二进制数的转换 入口参数 DX存放待转换的二进制数CX存放待转换数的位数 8位或16位 DI存放ASCII码首地址出口参数 转换后的字符串存放在以DI作指针的字节存贮区中程序如下 DATASEGMENTNUM8DB93HNUM16DWABCDHASCBUFDB20DUP 0 DATAENDSCODESEGMENTASSUMEDS DATA CS CODE SS STACKSTART MOVAX DATAMOVDS AXMOVDX 0MOVDL NUM8 转换二进制数送DXMOVCX 8 置位数8LEADI ASCBUF 字符串首址 DICALBTASC 调用子程序BTASC MOV DI BYTEPTR0DHMOV DI 1 BYTEPTR0AHMOV DI 2 BYTEPTR LEADX ASCBUFMOVAH 9INT21HMOVDX NUM16MOVCX 16 置位数16LEADI ASCBUFCALLBTASCMOV DL BYTEPTR0DHMOV DL 1 BYTEPTR0AHMOV DL 2 BYTEPTR 显示转换后的字符串LEADX ASCBUF MOVAH 9INT21HBTASCPROCPUSHAX 保存AXMOVAL 0CMPCX 8 比较8位数JNEL1 直接转换16位数MOVDH DL 8位数转换送DHL1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拉深工节假日前安全考核试卷含答案
- 汽车代驾员中秋节后复工安全考核试卷含答案
- 陶瓷挤出成型工节假日前安全考核试卷含答案
- 插秧机操作工节假日前安全考核试卷含答案
- 保险公司理赔服务质量提升方案
- 六年级分数运算课堂教学案例
- 2025-2030发酵型调味品菌种技术专利布局与竞争壁垒分析报告
- 2025-2030动力锂电池回收网点布局效率评估报告
- 高一英语作文写作技巧与范文
- 2025-2030动力电池热管理系统创新与能效提升分析报告
- 工伤受伤经过简述如何写
- 银行现金取款申请书
- 人事外包招聘代理合同
- 数字经济学-课件 第3章 数字技术
- AI引领时尚设计新潮-个性化需求的新一代解决方案
- 高二数学直线倾斜角与斜率同步练习题
- 2024-2030年全球及中国热障涂层(TBC)行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 大轻质泡沫混凝土研究报告
- 室内装修工程质量保障措施方案
- 闽教版小学3-6年级英语词表
- Unit2写作课课件(2024)七年级英语上册
评论
0/150
提交评论