第十二章子程序设计
第十二章 子程序设计
第节子程序调用与返回指令 1子程序调用指令 (1)段内直接调用 格式:CAL过程名;过程名是个标号 CALL NEAR PTR过程名 操作:SP←SP2;[SP,SP+1]←IP;保护断点IP←子程序入口偏移 地址;转子程序 SP→|mLss:堆栈 PH SP
第1节 子程序调用与返回指令 • 1. 子程序调用指令 • (1) 段内直接调用 • 格式:CALL过程名;过程名是个标号 • CALL NEAR PTR 过程名 • 操作:SP←SP-2;[SP,SP+1] ←IP;保护断点IP←子程序入口偏移 地址;转子程序
(2)段内间接调用 格式: CALLOPRD: OPRD≡{R,M(字) 操作:SPSP2SP,SP←IP;保护断点 P<[EAEA为依寻址方式所得有效地址 例如: CALLBX CALLWORD PTR [BX CALLDAT1;DAT1为字变量 CALLWORDPTRIBPI[SI
(2) 段内间接调用 格式:CALLOPRD;OPRD≡{R,M(字)} 操作:SP←SP-2;[SP,SP+1] ←IP;保护断点 IP←[EA];EA为依寻址方式所得有效地址 例如: CALLBX; CALLWORD PTR [BX]; CALLDAT1;DAT1为字变量 CALLWORDPTR[BP][SI]
3)段间直接调用 格式: CALL FAR PTR过程名 操作:SPSP2;[SP,SP+1CS;倮护断点 SPSP2;[SP,SP+1]←IP; CS←子程序入口段地址;转子程序入口 P子程序入口偏移地址; SS SP→ IPL IPHI SP-CSL CSH SP→
3) 段间直接调用 格式:CALL FAR PTR过程名 操作:SP←SP-2;[SP,SP+1] ←CS;保护断点 SP←SP-2;[SP,SP+1] ←IP; CS ←子程序入口段地址;转子程序入口 IP←子程序入口偏移地址;
(4)段间间接调用 格式: CALLOPRD:OPRD三{M(双字)} 操作:SPSP2;[5SP,SP+1]CS;保护断点 SP←SP2;[SP,SP+1]←IP CS←OPRD的段地址;转子程序入口 IP←ORD的偏移地址; 例如: CALLDWORD PTR [BXI CALLDAT2;DAT2为双字变 CALLDWORDPTRIBPILSI
(4) 段间间接调用 格式:CALLOPRD;OPRD≡{M(双字)} 操作:SP←SP-2;[SP,SP+1] ←CS;保护断点 SP←SP-2;[SP,SP+1] ←IP CS←OPRD的段地址;转子程序入口 IP←OPRD的偏移地址; 例如: CALLDWORD PTR [BX]; CALLDAT2;DAT2为双字变量 CALLDWORDPTR[BP][SI]
2子程序返回指令 格式1RE「 功能:放在子程序未尾,依CAL指令的属性(段内或段间) 返回调用程序的断点处继续执行。 操作:段内调用的RE指令 IP[SP,SP+1];SP←SP+2;恢复断点 段间调用的RE指令 IP[SP,SP+1];SP←SP+2;恢复断点 CS←[SP,SP+1];SP←SP+2 格式2:RETn 操作:与RE指令相同,但执行恢复断点操作后, SP←SP+n
2. 子程序返回指令 格式1:RET; 功能:放在子程序末尾,依CALL指令的属性(段内或段间) 返回调用程序的断点处继续执行。 操作:段内调用的RET指令 IP←[SP,SP+1];SP←SP+2;恢复断点 段间调用的RET指令 IP←[SP,SP+1];SP←SP+2;恢复断点 CS←[SP,SP+1];SP←SP+2; 格式2:RET n; 操作:与RET指令相同,但执行恢复断点操作后, SP ←SP+n;
第2背子程序的结构形式 1,子程序的说明文作 建立子程序的文档,说明该子程序的功能和调用 方法 2.子程序的现场保护和现场恢复 利用堆栈进行现场保护和现场恢复 3.子程序的调用和返回
第2节 子程序的结构形式 • 1. 子程序的说明文件 • 建立子程序的文档,说明该子程序的功能和调用 方法 • 2. 子程序的现场保护和现场恢复 • 利用堆栈进行现场保护和现场恢复 • 3. 子程序的调用和返回
子程序设计中注意事项 L,要正确使用堆栈(PUSH和POP指令要配对使用》,否则将导致不能 返回的错读 2,要注意保护和恢复数据(保护需要保护的寄存器或F的内容,用于 传递参数的寄奇存器可以不保护 例如 SUBI PROC FAR PUSHAX PUSHBX PUSHCX PUSHDX;保护数据 (子程序实际内容) POPDX POPCX: POPBX;恢复数据 POPAX;(后进先出) RET: SUB1 ENDP
子程序设计中注意事项 1,要正确使用堆栈(PUSH和POP指令要配对使用),否则将导致不能 返回的错误; 2,要注意保护和恢复数据(保护需要保护的寄存器或FR的内容,用于 传递参数的寄存器可以不保护) 例如: SUB1 PROC FAR PUSHAX; PUSHBX; PUSHCX; PUSHDX;保护数据 :(子程序实际内容) POPDX; POPCX; POPBX;恢复数据 POPAX;(后进先出) RET; SUB1 ENDP;
第3节参数传递方法 主程序在调用子程序前 要向子程序传送一些数据 要将执行的 些数据称为 参数传递的方法主要有约定寄存器法、约定存储器法与 堆栈法三种。 L约定寄存器法 寄存器法直接利用CPU内部寄存器传送参数。在转 向子程序之前,主程序将入口参数 入指定寄存器 调用子程序后,子程序从指定寄存器 用这些参数。经加工处理的结果也 放入指定的寄存器中,这样从子程序返回主程序后可以从 指定的寄存器中获得处理结果。这 方法最算单,但由于寄存器资源有限,故仅适用传递参数
第3节 参数传递方法 • 主程序在调用子程序前,常需要向子程序传送一些数据, 这些数据称为入口参数。当子程序执行完后,要将执行的 结果传回给主程序,这些数据称为出口参数。 参数传递的方法主要有约定寄存器法、约定存储器法与 堆栈法三种。 • 1.约定寄存器法 约定寄存器法直接利用CPU内部寄存器传送参数。在转 向子程序之前,主程序将入口参数 送入指定寄存器中;调用子程序后,子程序从指定寄存器 引用这些参数。经加工处理的结果也 放入指定的寄存器中,这样从子程序返回主程序后可以从 指定的寄存器中获得处理结果。这种 方法最简单,但由于寄存器资源有限,故仅适用传递参数 较少的情况
例74】编写程序,将字符串STR中的大写字母字符取出送字符串 5R2,并将字符串STR2在显示器上显示。 将判字符是否为大写字母字符编一子程序。为此,应将字符串STR SJR2的首地址和字符串STR的长度送寄存器作为入口参数传递给子程序 程序流程图如下图所示 开始 开始 保护现场 SI←STRl偏移地址 DI←STR2偏移地址 ≥A CX+STR的长度 将字符保存至STR2 调用子程序 F <完成否 显示STR2 恢复现场 结束 结束 (1)主程序流程图 (2)子程序流程图
【例7—4】编写程序,将字符串STRl中的大写字母字符取出送字符串 STR2,并将字符串STR2在显示器上显示。 将判断字符是否为大写字母字符编一子程序。为此,应将字符串STRl、 STR2的首地址和字符串STRl的长度送寄存器作为入口参数传递给子程序。 程序流程图如下图所示