欢迎来到天天文库
浏览记录
ID:39513364
大小:281.50 KB
页数:28页
时间:2019-07-04
《汇编语言程序设计第9章子程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、8086/8088和ARM核汇编语言程序设计第9章子程序设计教学重点:子程序设计方法9/20/20211第9章子程序的设计9.2子程序的参数传递9.3子程序嵌套与递归第9章子程序设计9.1子程序设计方法9.4子程序库9/20/20212第9章子程序的设计子程序又称为过程,是能完成特定功能有一定通用性的程序段,在需要时能被其它程序调用。调用子程序的程序常称为主程序。一般把源程序中反复出现的程序段或常用的功能独立的程序段设计成子程序供用户使用。这样可以简化源程序结构、节省目标程序的存储空间,提高程序设计的效率。子程序结构也是模块化程序设计的基础。本章主要介绍子程序的定义、子程序调用和
2、返回、子程序的参数传递以及子程序库等知识。9.1子程序设计方法9/20/20213第9章子程序的设计9.1子程序设计方法9.1.1子程序的定义子程序的定义是由过程定义伪指令PROC和ENDP实现,格式如下:过程名PROC[NEAR
3、FAR]…;过程体过程名ENDPNEAR属性的过程只能被相同代码段的其他程序调用,FAR属性的过程可以被不同代码段的程序调用。(1)子程序和主程序在同一个代码段中,则子程序定义为NEAR属性。(2)子程序和主程序不在同一个代码段中,则子程序定义为FAR属性。(3)主程序通常定义为FAR属性,这是因为主程序被看作DOS调用的一个子程序,以便执行完返回DO
4、S。9/20/20214第9章子程序的设计9.1子程序设计方法9.1.1子程序的定义子程序可以放在代码段主程序开始执行之前的位置,也可放在代码段的末尾主程序执行终止后的位置。为了便于其他程序员能正确使用子程序,在编写子程序时,还要养成书写子程序说明信息的良好习惯。子程序说明信息一般包括以下内容:(1)子程序名(2)功能描述(3)入口和出口参数(4)调用注意事项和说明等9/20/20215第9章子程序的设计9.1子程序设计方法9.1.1子程序的定义例9.1编写一个子程序,从键盘输入一位十进制数。;子程序名:stdin;功能:完成从键盘输入一位十进制数;入口参数:等待键盘输入;出口参
5、数:al中存放输入的数值stdinprocmovah,1int21hcmpal,30hjlnextcmpal,39hjgnextandal,0fhnext:retstdinendp9/20/20216第9章子程序的设计9.1子程序设计方法9.1.2子程序调用与返回子程序调用与返回由CALL和RET指令实现。子程序调用指令首先把子程序的返回地址(即CALL指令的下一条指令的地址)压入堆栈,然后转移到子程序的入口地址执行子程序。根据子程序和主程序是否在同一代码段,分为段内调用和段间调用。子程序和主程序在同一个代码段中称为段内调用;子程序和主程序不在同一个代码段中,称为段间调用。子程序
6、返回指令负责把压入栈区的返回地址弹出送IP或CS∶IP,实现返回主程序继续往下执行。与子程序的段内调用和段间调用相对应,子程序的返回也分为段内返回和段间返回。9/20/20217第9章子程序的设计9.1子程序设计方法9.1.2子程序调用与返回当子程序和主程序在同一个代码段中,子程序的定义和调用如下图:codesegmentmainprocfar……callsuba……retmainendpsubaprocnear……retsubaendpcodeends9/20/20218第9章子程序的设计9.1子程序设计方法9.1.2子程序调用与返回当子程序和主程序不在同一个代码段中,子程序的
7、定义和调用如下图:code1segmentmainprocfar……callfarptrsuba……retmainendpcode1endscode2segmentsubaprocfar……retsubaendpcode2ends9/20/20219第9章子程序的设计9.1子程序设计方法9.1.3寄存器内容的保护与恢复通常主程序和子程序是分别编制的,所以它们可能会使用同一个寄存器。如果主程序中某个寄存器的内容在调用子程序后还要用,而子程序又恰好使用了同一个寄存器,当子程序修改了寄存器的内容后,返回到主程序时,该寄存器的内容也就不会是调用子程序前的内容,这样,常常会导致调用程序的出
8、错。为此,编写子程序时,在一进入子程序后,就把它所用到的寄存器内容压进栈,在返回前,再把它们弹出栈。为什么寄存器的保护与恢复?9/20/202110第9章子程序的设计9.1子程序设计方法9.1.3寄存器内容的保护与恢复例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAXPUSHBXPUSHCX;保护现场PUSHDX┆POPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROCENDP注意:堆栈
此文档下载收益归作者所有