1、汇编与 C/C+的混合编程要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐应该采用过程调用伪指令 INVOKE使用 INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明过程声明和过程调用伪指令过程名 PROC 调用距离 语言类型 作用范围 USES 寄存器列表 , 参数 :类型LOCAL 参数表 ;汇编语言语句过程名 ENDP过程声明伪指令: 用于事先声明过程的结构过程名 PROTO 调用距离 语言类型 , 参数 :类型过程调用伪指令INVOKE 过程名 ,参数 ,.如何调用调用距离调用距离 可以是 NEAR16、NEAR32、 FAR, 表示该过程是近或远调用。简化段
2、格式中,缺省值由.model语句选择的存储模式决定。 语言类型语言类型 可以是任何有效的语言类型,确定该过程采用的命名约定和调用约定;语言类型还可以由 .model伪指令指定 语言类型 C SYSCALLSTDCALL PASCALBASIC FORTRAN命名约定 名字前加下划线名字前加下划线名字变大写名字大写名字大写参数传递顺序 从右到左 从右到左(注) 从左到右从左到右从左到右平衡堆栈的程序调用程序 被调用程序被调用程序 被调用程序被调用程序被调用程序保存 BP 是 是 是允许 VARARG参数是 是 是 作用范围 作用范围 可以是 PUBLIC、 PRIVATE、 EXPORT, 表示
3、该过程是否对其他模块可见。缺省是 PUBLIC, 表示其他模块可见;PRIVATE表示对外不可见; EXPORT隐含有PUBLIC和 FAR, 表示该过程应该放置在导出表( export entry table)。起始参数起始参数 采用这个格式的 PROC伪指令,汇编系统将自动创建过程的起始代码( Prologue code) 和收尾代码(Epilogue code), 用于传递堆栈参数以及清除堆栈等。起始参数表示传送给起始代码的参数;它必须使用尖括号 “ ” 括起来,多个参数用逗号分隔。 寄存器列表寄存器列表 指通用寄存器名,用空格分隔多个寄存器。只要利用“ USES 寄存器列表 ” 罗列该
4、过程中需要保存与恢复的寄存器,汇编系统将自动在起始代码产生相应的入栈指令,并对应在收尾代码产生出栈指令。 参数参数 类型 表示过程使用的形参及类型。在 16位段中,缺省的类型是字 WORD , 在 32位段中缺省的类型是双字 DWORD 。参数类型可以是任何 MASM有效的类型或 PTR( 表示地址指针);在 C、 SYSCALL、STDCALL语言类型中。PROC伪指令中使用参数,必须定义语言类型。局部变量 如果过程使用局部变量,紧接着过程定义伪指令 PROC, 可以采用一条或多条 LOCAL伪指令说明。其中,可选的 “ 个数 ” 表示同样类型数据的个数,类似数组元素的个数。在 16位段中,
5、缺省的类型是字 WORD , 在 32位段中缺省的类型是双字 DWORD 。 使用 LOCAL伪指令说明局部变量后,汇编系统将自动利用堆栈存放该变量 .例 fig6-20new.asm此例该自 fig6-20.asm,请注意比较。.386.MODEL FLAT, stdcallExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORDMove PROTO NEAR32 C, :WORD, :BYTE, :BYTE, :BYTEinclude io.h ; header file for input/outputcr equ 0dh ; carriage return characterLf equ 0ah ; line feed