第十一节 子程序的调用

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

寄存器或存储器法举例 寄存器或存储器法举例
• 例如, 编写一个子程序, 将片内RAM 的一组单元清零, 子程序不包含这组单元 例如,编写一个子程序,将片内RAM的一组单元清零, RAM的一组单元清零 的起始地址和单元的个数: 的起始地址和单元的个数: SUBRT:MOV A, #00H : , LOOP: MOV @R0,A : , INC R0 DJNZ R7, LOOP , RET 主程序调用SUBRT时,就必须向它提供两个入口参数:被清零单元的起始地址 主程序调用 时 就必须向它提供两个入口参数: 和被清零单元的个数。采用寄存器或存储器法调用SUBRT的主程序应该是: 和被清零单元的个数。采用寄存器或存储器法调用 的主程序应该是: 的主程序应该是 MAIN: …… …… : MOV R0,#30H;传递 , ;传递RAM数据区的起始地址 数据区的起始地址 MOV R7,#0AH;传递 , ;传递RAM数据区的长度 数据区的长度 ACALL SUBRT; 调用清零子程序 ; …… …… MOV R0,#50H;传递 , ;传递RAM数据区的起始地址 数据区的起始地址 MOV R7,#10H;传递 , ;传递RAM数据区的长度 数据区的长度 ACALL SUBRT; 调用清零子程序 ; SUBRT:同前 :
主程序与子程序间的参数传递 主程序与子程序相互传递的信息称为参数。 主程序与子程序相互传递的信息称为参数。主程序提供给 子程序以便加工处理的信息称为入口参数, 子程序以便加工处理的信息称为入口参数,经子程序加工 处理后回送给主程序的信息称为出口参数。 处理后回送给主程序的信息称为出口参数。在调用子程序 主程序应事先把入口参数放到某些约定的位置。 时,主程序应事先把入口参数放到某些约定的位置。子程 序在运行时,可以从约定的位置得到有关的参数。同样, 序在运行时,可以从约定的位置得到有关的参数。同样, 子程序在运行结束前,也应把出口参数送到约定位置。 子程序在运行结束前,也应把出口参数送到约定位置。在 返回主程序后,主程序可以从这些地方得到需要的结果。 返回主程序后,主程序可以从这些地方得到需要的结果。
第十节 子程序的调用
子程序的概念
• 子程序是一种重要的程序结构。 在实用中, 子程序是一种重要的程序结构 。 在实用中 , 常会遇到需要反复多次执行同一程序段的情 为了减少重复编写的工作量, 形 。 为了减少重复编写的工作量 , 并减少程 序存储空间, 常常把功能完整、 序存储空间 , 常常把功能完整 、 意义明确并 次使用的程序段从原来的程序( 被多次使用的程序段从原来的程序(称为主程 中分离出来独立编写,就成为子程序, 序)中分离出来独立编写,就成为子程序,从 而主程序可根据需要多次调用子程序。 而主程序可根据需要多次调用子程序。
子程序调用与堆栈的关系
• 为了能够成功地调用子程序,主程序应能在需要时通过调用指 为了能够成功地调用子程序, 令自动转入子程序, 令自动转入子程序,子程序完成后应能够通过末尾的返回指令 自动返回调用指令下一条指令地址(称为断点地址 处继续执行。 称为断点地址)处继续执行 自动返回调用指令下一条指令地址 称为断点地址 处继续执行。 • 因此,调用指令不仅要将子程序入口地址送到程序计数器 , 因此,调用指令不仅要将子程序入口地址送到程序计数器PC, 还要将断点地址存入堆栈保护起来。 以便实现程序转移,还要将断点地址存入堆栈保护起来。返回 指令则要将断点地址从堆栈中取出送给PC, 指令则要将断点地址从堆栈中取出送给 ,以便返回断点处继 续执行主程序。 续执行主程序。
寄存器或存储器法举例 寄存器或存储器法举例

• • • • • • • • • • • • • • • •
MAIN: MOV R0,#29H : , MOV R2 ,#06H MOV R3,#09H , ACALL JIAFA MOV A,R7 , MOV @R0,A , MOV R2,#25H , MOV R3,#45H , ACALL JIAFA MOV A,R7 , MOV @R0,A , …… JIAFA:MOV A,R2 : , ADD A,R3 , MOV R7,A , INC R0 。
• 该程序的功能是什么?子程序的入口参数和出口参数分别存 该程序的功能是什么? 放在哪个寄存器中?子程序最后还有的一条指令是什么? 放在哪个寄存器中?子程序最后还有的一条指令是什么?
思考题
• • • 调用子程序及返回与堆栈无关。 ( )调用子程序及返回与堆栈无关。 ( )一段子程序可以被主程序多次调 用。 主程序调用子程序时是怎样确保返回主 程序调用指令后的断点位置, 程序调用指令后的断点位置,以便在断 点处继续执行主程序? 点处继续执行主程序?
绝对调用指令 • 绝对调用指令:ACALL addr11 绝对调用指令: • 绝对调用指令与绝对转移指令AJMP一样提供的 绝对调用指令与绝对转移指令 一样提供的 是低11位转移目的地址 位转移目的地址, 是低 位转移目的地址,而转移目的地址的高五 位保持不变,与指令首地址加2后的地址的高五 位保持不变,与指令首地址加 后的地址的高五 位是一样的,所以绝对调用指令限在2K地址空 位是一样的,所以绝对调用指令限在 地址空 间内调用。两种指令所不同的是指令ACALL 间内调用。两种指令所不同的是指令 addr11要把主程序调用处的断点地址压入堆栈保 待执行子程序结束处的返回指令, 护起来,待执行子程序结束处的返回指令,把堆 栈里的断点地址推出到PC中 栈里的断点地址推出到 中,这样单片机就可 以根据PC值 回到主程序, 以根据 值,回到主程序,从其断点位置继续 执行程序。 执行程序。
主程序与子程序间的参数传递 寄存器或存储器法
• 寄存器或存储器法 就是主程序与子程序间传递 寄存器或存储器法就是主程序与子程序间传递 的参数都在约定的寄存器或存储器中。 的参数都在约定的寄存器或存储器中 。 在调用 子程序前主程序将入口参数送到约定的寄存器 或存储器中, 或存储器中 , 子程序直接从这些寄存器或存储 器中取得这些参数进行运算处理, 器中取得这些参数进行运算处理 , 经加工处理 后得到的结果, 后得到的结果 , 即出口参数也放在约定的寄存 返回主程序后, 器或存储器中 , 返回主程序后 , 主程序就从该 寄存器或存储器中得到结果。 寄存器或存储器中得到结果。
长调用指令和返回指令
• 长调用指令: LCALL addr16 长调用指令: • 本指令的机器码为:00010010B addr8~15 addr0~7 本指令的机器码为: • LCALL指令提供 位目标地址,以调用 指令提供16位目标地址 以调用64K字节范围内所指 指令提供 位目标地址, 字节范围内所指 定的子程序。执行本指令,首先(PC)+3→(PC),以获得下一条 定的子程序。执行本指令,首先 , 指令的首地址(此地址为断点地址) 然后把这16位主程序断 指令的首地址(此地址为断点地址) ,然后把这 位主程序断 点地址先后压入堆栈(先压入 先压入PC0~7低位字节,后压入 低位字节, 点地址先后压入堆栈 先压入 低位字节 后压入PC8~15 高位字节)。栈指针SP加 指向栈顶 接着将16位子程序首地址 指向栈顶。 高位字节 。栈指针 加2指向栈顶。接着将 位子程序首地址 addr16送入程序计数器 addr16送入程序计数器PC,从而使程序从主程序断点处转向 送入程序计数器PC, 子程序首地址(addr16)开始执行被调用的子程序 开始执行被调用的子程序。 子程序首地址(addr16)开始执行被调用的子程序。子程序的首 址可设置在64K字节程序存储器地址空间的任何位置。 字节程序存储器地址空间的任何位置。 址可设置在 字节程序存储器地址空间的任何位置 • 返回指令:RET 返回指令: • 本指令的机器码为:22H(00100010B) 本指令的机器码为: ( ) • RET指令是从子程序返Fra Baidu bibliotek。当程序执行到本指令时,表示结束 指令是从子程序返回。 指令是从子程序返回 当程序执行到本指令时, 子程序的执行,返回调用指令ACALL或LCALL的下一条指令 子程序的执行,返回调用指令 或 的下一条指令 处继续往下执行。因此, 处继续往下执行。因此,它的主要操作是将保护在堆栈内的主 程序断点地址送到PC中 程序断点地址送到 中 。
子程序调用举例
例 设(SP)=07H ORG 0123H MAIN: LCALL SUBRTN : ;主程序 长调用指令 ANL A,#55H , …… ORG 5678H SUBRTN:MOV A,#05H : , ;子程序 …… RET ;返回主程序断点
子程序返回举例
• 例 设 (SP)=07H , 符 号 地 址 “ SUBRTN”指向程序存储器的 指向程序存储器的 5678H,(PC)=0123H。从0123H , = 。 处执行指令: 处执行指令: • MAIN:LCALL SUBRTN : • ;主程序长调用指令 • …… • SUBRTN:MOV A,#05H : , • ;子程序 • …… • RET • ;返回主程序断点
相关文档
最新文档