第六章子程序结构
§ 子程序的设计方法
§ 嵌套与递归子程序
§ 子程序举例
§ DOS系统功能调用
§ 子程序的设计方法
一、子程序指令
二、子程序的调用与返回
三、现场的保护与恢复
四、子程序参数的传递
一、子程序指令
子程序是完成特定功能的一段程序
当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行
当运行完子程序功能后,采用RET返回指令回到主程序继续执行
一、子程序指令—调用指令
CALL指令分成4种类型(类似JMP)
CALL label ;段内调用、直接寻址
CALL r16/m16 ;段内调用、间接寻址
CALL far ptr label ;段间调用、直接寻址
CALL far ptr mem ;段间调用、间接寻址
CALL指令需要保存返回地址:
段内调用——入栈偏移地址IP
SP←SP-2,SS:[SP]←IP
段间调用——入栈偏移地址IP和段地址CS
SP←SP-2,SS:[SP]←CS
SP←SP-2,SS:[SP]←IP
一、子程序指令—返回指令
根据段内和段间、有无参数,分成4种类型
RET ;无参数段内返回
RET i16 ;有参数段内返回
RET ;无参数段间返回
RET i16 ;有参数段间返回
需要弹出CALL指令压入堆栈的返回地址
段内返回——出栈偏移地址IP
IP←SS:[SP], SP←SP+2
段间返回——出栈偏移地址IP和段地址CS
IP←SS:[SP],SP←SP+2
CS←SS:[SP],SP←SP+2
一、子程序指令—返回指令RET的参数
RET i16 ;有参数返回
RET指令可以带有一个立即数i16,完成RET操作后,堆栈指针SP将增加,即
SP←SP+i16
这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数
二、子程序的调用与返回
CALL label
主程序
RET
子程序
回到CALL指令后的指令处——返回地址
二、子程序的调用与返回 —书写形式(同一代码段内)
二、子程序的调用与返回 —书写形式(不同代码段)
三、现场的保护与恢复
现场:主程序转向子程序之前,其所使用的一些资源的状态(如标志位、R/M等)
子程序与主程序分别编制,通常会导致使用的资源发生冲突而影响主程序在调用子程序之后的正确执行
方法:利用堆栈
在主程序中进行
在子程序中进行
汇编语言(天津大学)chapter 6 来自淘豆网www.taodocs.com转载请标明出处.