7.5 子程序的完全定义

在7.1节所给出的子程序定义格式是一个最基本的、最简单的定义格式,它不能为子程序提供更简洁的调用方式。在宏汇编MASM 6.11系统中,为微机汇编语言的子程序提供了更加丰富的定义方式。

虽然子程序的这种定义方式显得稍微有点复杂,但它不仅为子程序的调用带来了极大的方便,而且其调用方式与高级语言中子程序的调用方式相一致,这就大大地降低了程序员熟练掌握它的难度。

7.5.1 子程序完全定义格式

子程序名 PROC [distance] [langtype] [visibility] [<prologuearg>]
[USES 寄存器列表] [,参数[:数据类型]]...
[LOCAL varlist]
子程序的程序体
子程序名 ENDP

定义子程序时,可使用参数表来直接指明其所要的参数,但程序员必须先用.MODEL伪指令,或使用<langtype>参数来说明本子程序所使用的程序设计语言类型。

程序员在定义子程序时,最好能象在高级语言(如:C/C++)定义过程那样,先说明该子程序的原型(用伪指令PROTO),这样,在调用时,系统可以自动进行类型检查,也可以使用更方便的调用伪指令INVOKE来调用该子程序。有关子程序的原型说明伪指令和调用伪指令在随后第7.5.87.5.9小节中加以介绍。

子程序通常用RET指令来结束其执行,也可用指令“RET n”来指明在结束子程序执行后从堆栈弹出n个字节。有关返回指令请参阅7.2.2节中的叙述。

汇编程序在处理子程序时能自动产生“起始”代码(PROLOGUE Code)和“结束”代码(EPILOGUE code)。这两段特殊的代码分别完成:在调用子程序时,能把传递给子程序的参数压栈,在子程序结束时能把先前压栈的参数弹出。有了这两段代码,程序员在调用子程序时就不用自行考虑子程序的参数传递问题。

若子程序用指令RETN、RETF或IRETF作为子程序的结束指令,那么,汇编程序将不生成“结束”代码。

程序员可以用自己定义宏来替代缺省的“起始”和“结束”的代码段。这种替代方法是使用伪指令:OPTION PROLOGUE和OPTION EPILOGUE。

若子程序没有参数、局部变量,没使用USES子句,也不会产生新的段或段组,那么,子程序是可以嵌套定义的。程序员也可以使用返回指令RETN和RETF来避免子程序的嵌套。

在子程序内部,可以在指令之前使用伪指令LOCAL来说明其局部变量,有关规定在随后的第7.5.10节中有详细的说明。

下面就来介绍该定义格式中各个说明项的作用。