C语言/C++调用汇编语言函数
为设备驱动器和嵌入式系统编码的程序员常常需要把 C/C++ 模块与用汇编语言编写的专门代码集成起来。汇编语言特别适合于直接硬件访问、位映射,以及对寄存器和 CPU 状态标识进行底层访问。
整个应用程序都用汇编语言编写是很乏味的,比较有用的方法是,用 C/C++ 编写主程序,而那些不太好用 C 编写的代码则用汇编语言。现在来讨论一下从 32 位 C/ C++ 程序调用汇编程序的一些标准要求。
C/C++ 程序从右到左传递参数,与参数列表的顺序一致。函数返回后,主调程序负责将堆栈恢复到调用前的状态。这可以采用两种方法:一种是将堆栈指针加上一个数值,该值等于参数大小;还有一种是从堆栈中弹出足够多的数。
在汇编源代码中,需要在 .MODEL 伪指令中指定 C 调用规范,并为外部 C/C++ 程序调用的每个过程创建原型。示例如下:
.586
.model flat,C
IndexOf PROTO,
srchVal:DWORD, arrayPtr:PTR DWORD, count:DWORD
函数声明
在 C 程序中,声明外部汇编过程时要使用 extern 限定符。比如,下面的语句声明了 IndexOf:
extern long IndexOf(long n, long array[], unsigned count);
如果过程会被 C++ 程序调用,就要添加“C”限定符,以防止 C++ 的名称修饰:
extern "C" long IndexOf(long