黄强 汇编 第5章子程序设计课件.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
黄强 汇编 第5章子程序设计课件

第5章 子程序设计 ;5.1 子程序与调用程序 5.2 子程序与主程序的参数传递 5.3 子程序中寄存器的保护与恢复 5.4 嵌套与递归子程序设计 实训一 普通子程序设计 实训二 嵌套子程序设计;5.1 子程序与调用程序;5.1.1 段内调用 供段内调用的子程序必须被定义为NEAR类型,并与主程序位于同一个代码段中。子程序的位置通常在主程序的所有可执行指令之前或之后,不能放在主程序的可执行指令序列内部,否则会破坏主程序结构。;DATA SEGMENT STRG DB ‘HFEUWINFD4632*%587fdjljowjo#$4’,-1 LENTH DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,STRG ;DX为字符串首地址,作入口参数 CALL SCONT ;调用子程序 MOV LENTH,BX ;保存结果 MOV AH,4CH INT 21H;SCONT PROC NEAR PUSH SI ;保护寄存器 XOR BX,BX ;DX寄存器用于统计结果 MOV SI,DX ;传递地址指针 NEXT: CMP BYTE PTR [SI],-1 ;是否结束标志 JZ OVER ;是则转OVER INC BX ;统计 INC SI ;修改地址指针 JMP NEXT OVER: POP SI RET SCONT ENDP CODE ENDS END START;5.1.2.段间调用 供段间调用的子程序必须被定义为FAR类型,并与主程序位于不同的代码段中,也可分属于不同的模块。 【例5.2 】从键盘上输入一个长度小于100的字符串,存入以BUFF为首地址的缓冲区,其中如有大写字母,要求用子程序转换为小写字母,字符串以回车键作为结束。 分析:本例中子程序以远程子程序的方式书写,它单独占用一个代码段。子程序的功能是将大写字母转换为小写字母,方法是大写字母的ASCII码加上20H。程序如下:;DATA SEGMENT BUFF DB 100 DUP(?) DATA ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,BUFF ;置地址指针 NEXT: MOV AH,00H INT 16H CMP AL,0DH JZ DONE ;是回车键则结束 CALL FAR PTR CHANG ;调用子程序 MOV [SI],AL ;保存 INC SI ;修改地址指针 JMP NEXT DONE: MOV AH,4CH INT 21H CODE1 ENDS;CODE2 SEGMENT ASSUME CS:CODE2 CHANG PROC FAR CMP AL,’A’ JB OVER CMP AL,’Z’ JA OVER ADD AL,20H ;是大写字母则转换为小写字母 OVER: RET CHANG ENDP CODE2 ENDS END START; 注意:子程序是利用调用(CALL)指令和返回(RET)指令来实现正确的调用和返回的。因为CALL命令执行时压入堆栈的断点地址就是供子程序返回主程序时的地址(包括段地址和偏移地址),编程时一定要注意子程序的类型属性,即是段内调用还是段间调用。段内调用和返回为NEAR属性,段间调用和返回为FAR属性。8086/8088的汇编程序用子程序定义PROC的类型属性来确定CALL和RET指令的属性。如果所定义的子程序是FAR属性,那么对它的调用和返回一定都是FAR属性;如果所定义的子程序是NEAR属性,那么对它的调用和返回也一定是NEAR属性。这样用户只是在定义子程序时考虑它的属性,而CALL和RET指令的属性就可以由汇编程序来确定了。另外,进入子程序后再使用堆栈时也必须保证压入和弹出字节数一致,如果在这里堆栈存取出错,必然会导致返回地址的错误。;5.2 子程序与主程序的参数传递;5.2.1 利用寄存器传递参数 使用寄存器传递参数最为快速直观,是最常用的参数传递方式。但由于寄存器是计算机中的稀有资源,数目有限,因而只适于传递较少数目的参数。其方法是主程序将子程序的入口参数放入指定的寄存器,然后再调用子程序。 ;【例5.2 】现有以DAT为首地址的字数组共10个元素,编程按5位十进制形式显示这10个元素,并注明正负号。要求比较正负及显示部分用子程序实现。 分析:本题主程序功

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档