1.调用约定(calling convension)大致分为两种:stdcall和cdecl.主要区别是调用结束后是caller(调用函数)还是callee(被调用函数)清空堆栈中的参数.stdcall规定callee负责清空堆栈中的参数.cdecl规定caller清空堆栈里的参数.
2.首先下载nasm(for windows),解压缩将nasm.exe所在路径加入到系统变量PATH,方便编译,省得输入长串的路径名.
3.新建一个win32 console application工程,增加一个asm文件,右键选择'设置',命令中填入:nasm $(InputName).asm -f win32 -o Debug/$(InputName).obj,表示用nasm编译器将.asm文件编译成win32格式的obj文件,输出填入:Debug/$(InputName).obj,这样asm文件就可以在vc中编译了,obj文件会存放在该目录中Debug文件.
4.在c源文件中使用extern "C" _stdcall int yourpro(int a,int b)声明要调用的汇编函数,在asm源文件中使用global声明被调用的函数.例子如下:
#c源文件
#include <stdio.h>
extern "C" int _cdecl add(int a,int b);
void main(){
add(4,8);
}
;asm源文件
[SECTION code]
[BITS 32]
global _add ;
_add:
push ebp ;
mov ebp,esp ;
sub esp,40h ;
push ebx ;
mov eax,[ebp+8] ;
mov ebx,[ebp+12] ;
add eax,ebx ;
pop ebx ;
add esp,40h ;
pop ebp ;
ret ;