44子程序与扩展子程序 在程序设计中,常常会遇到某些功能完全相同 的程序段在同一程序的多处或不同程序中出现, 如求一个数的阶乘,比较两数大小,求字符串 的长度,数制转换等等。为了节省存贮空间, 减少编制程序的重复劳动,可以将这些多次重 复的程序段从整个程序中独立出来,附加一些 额外语句,将它编制成一种具有公用性的,独 立的程序段——子程序,并通过适当的方法把 它与其他程序段链接起来,这种程序设计的方 法就称为子程序设让
4.4 子程序与扩展子程序 ◼ 在程序设计中,常常会遇到某些功能完全相同 的程序段在同一程序的多处或不同程序中出现, 如求一个数的阶乘,比较两数大小,求字符串 的长度,数制转换等等。为了节省存贮空间, 减少编制程序的重复劳动,可以将这些多次重 复的程序段从整个程序中独立出来,附加一些 额外语句,将它编制成一种具有公用性的,独 立的程序段——子程序,并通过适当的方法把 它与其他程序段链接起来,这种程序设计的方 法就称为子程序设计
子程序结构的优点: ■可以减小程序的长度,节省了计算机汇 编源程序的时间和程序的存储空间。 子程序可以重复使用,使得程序设计时 间可以大量节省 ■增加了程序的可读性,方便对程序的修 改、调试 子程序是模块化、结构化、自顶向下程 序设计的基础
子程序结构的优点: ◼ 可以减小程序的长度,节省了计算机汇 编源程序的时间和程序的存储空间。 ◼ 子程序可以重复使用,使得程序设计时 间可以大量节省。 ◼ 增加了程序的可读性,方便对程序的修 改、调试。 ◼ 子程序是模块化、结构化、自顶向下程 序设计的基础
MASM6x子程序定义的方法 般过程定义(子程序)伪指令。 子程序在汇编语言中也称为过程 ( Procedure),它相当于高级语言C++ 的函数和VB的过程 ■扩展过程定义(扩展子程序)伪指令
MASM6.x子程序定义的方法 ◼ 一般过程定义(子程序)伪指令。 子程序在汇编语言中也称为过程 (Procedure),它相当于高级语言C++ 的函数和VB的过程 ◼ 扩展过程定义(扩展子程序)伪指令
一般过程定义(子程序)伪指令 过程定义的一般格式为: 过程名PROC[ NEAR/FAR] ;过程定义体 RET 过程名ENDP
一般过程定义(子程序)伪指令 ◼ 过程定义的一般格式为: 过程名 PROC [NEAR/FAR] . . ;过程定义体 . RET 过程名 ENDP
过程名由程序员来命名,命名方法同变量名, 同一源程序中不能有相同的过程名 PROC为过程定义开始伪指令,ENDP为过程定 义结東伪指令, PROC-ENDP必须配对使用;配 对的 PROC-ENDP前面的过程名应相同 NEAR/FAR定义了过程的属性,NEAR属性的过 程只能被相同代码段的程序调用,称为段内近 调用;FAR属性的过程只能被相同或不同 代码段的程序调用,称为段间远调用
◼ 过程名由程序员来命名,命名方法同变量名, 同一源程序中不能有相同的过程名。 ◼ PROC为过程定义开始伪指令,ENDP为过程定 义结束伪指令,PROC-ENDP必须配对使用;配 对的PROC-ENDP前面的过程名应相同。 ◼ NEAR/FAR定义了过程的属性,NEAR属性的过 程只能被相同代码段的程序调用,称为段内近 调用;FAR 属性的过程只能被相同或不同 代码段的程序调用,称为段间远调用
子程序的结构形式 一个完整的子程序一般包括下列内容 (1)子程序的说明部分 (2)子程序的调用和返回 (3)子程序的现场保护和现场恢复
子程序的结构形式 ◼ 一个完整的子程序一般包括下列内容: (1) 子程序的说明部分 (2) 子程序的调用和返回 (3) 子程序的现场保护和现场恢复
子程序的说明部分 子程序的说明部分一般包括如下内容: (1)子程序名。命名时要见名知意。 (2)子程序的功能。说明子程序完成的任务。 (3)子程序的入口参数。说明子程序运行所需参数及存放 位置。 (4)子程序的出口参数。说明子程序的运行结果的参数及 存放位置。 (5)子程序所占用的寄存器和工作单元 (6)子程序调用示例
子程序的说明部分 ◼ 子程序的说明部分一般包括如下内容 : (1)子程序名。命名时要见名知意。 (2)子程序的功能。说明子程序完成的任务。 (3)子程序的入口参数。说明子程序运行所需参数及存放 位置。 (4)子程序的出口参数。说明子程序的运行结果的参数及 存放位置。 (5)子程序所占用的寄存器和工作单元。 (6)子程序调用示例
举例 ;子程序名:B16TOD ;子程序的功能:完成将一个16位二进制数(无 符号数)转换为对应的十进制数的 ASCI码,存放在共享存储区 SHALLUNIT ;子程序的入口参数:存放在 BINNUM存储单元 ;子程序的出口参数:存放在共享存储区 SHALLUNIT和共享存储单元 ADDRESS ;子程序所占用的寄存器和:AX,DX,SI,BX ;子程序调用示例:
举例 ;子程序名:B16TOD ;子程序的功能:完成将一个16位二进制数(无 符号数)转换为对应的十进制数的 ;ASCII码,存放在共享存储区SHALLUNIT ;子程序的入口参数:存放在BINNUM存储单元 ;子程序的出口参数:存放在共享存储区 SHALLUNIT和共享存储单元ADDRESS ;子程序所占用的寄存器和:AX,DX,SI,BX ;子程序调用示例:
程序的调用和返回 main sub1 sU call subl call sub2 返回 地址 en ret ret
子程序的调用和返回 . . . . . . . . . . . . ret ret call sub1 call sub2 . . . . . . main sub1 sub2 end 返回 地址
■CALL指令的执行分成两步 第一步,保护返回地址(CAL指令下 条指令的地址),利用堆栈实现,即将 返回地址压入堆栈 第二步,转向子程序,即把子程序的首 地址送入IP或CS:IP ■RET指令的功能是返回主程序,即把子程 序的返回地址送入IP或CSIP
◼ CALL指令的执行分成两步 : 第一步,保护返回地址(CALL指令下一 条指令的地址),利用堆栈实现,即将 返回地址压入堆栈; 第二步,转向子程序,即把子程序的首 地址送入IP或CS:IP ◼ RET指令的功能是返回主程序,即把子程 序的返回地址送入IP或CS:IP