總結一下:
對于NASM與VC混合編程
在ASM文件的開頭輸入
[bits 32] ;使用32位模式的處理器
[section .text] ;text段, 代碼段,只讀并可執行
聲明代碼段并且代碼段是32位,應為對于VC生成的PE文件,其代碼放在.text的代碼段內
,數據放在.data的數據段內,所以如果要定義數據的話,要在.data段內
{一} 在C代碼中調用匯編程序
1..如果遵守C 調用約定
打比方我們在ASM中實現兩個數相加的函數:
_myadd:
push ebp
mov ebp,esp
mov eax,[ebp+8] ;a
mov ebx,[ebp+12] ;b
add eax,ebx
add esp,4
mov esp,ebp
pop ebp
ret
在ASM的開頭寫上global _myadd;
在C文件中聲明函數 extern "C" int _cdecl myadd(int a,int b);
最主要的是要在ASM的函數名稱的前面加上一個 _(下劃線) ,但是在C文件中聲明的函數不用加下劃線,并且一定要加上extern "C",并且用_cdecl 聲明,這樣以后就可以在C中調用ASM中的函數了。
2.如果遵守stdcall 調用約定
還用上面的那個兩個數相加的例子
_myaddstdcall@8:
push ebp
mov ebp,esp
mov eax,[ebp+8] ;a
mov ebx,[ebp+12] ;b
add eax,ebx
add esp,4
mov esp,ebp
pop ebp
ret 8
在ASM文件的開頭寫上 global _myaddstdcall@8
在C文件中聲明函數 extern "C" int _stdcall myaddstdcall(int a,int b);
這里要注意的是函數的名稱問題,一般是_XXX@N ,也就是在開頭加上一個下劃線,@N中的N跟參數的大小有關系,目前我的理解是所有參數在堆棧中占用的總的大小.但是不確定,我只是推測的,如果那位知道具體的規定一定要告我一聲啊。
{二} 在匯編中調用C中的函數
1.遵守C調用約定
舉個例子:
extern "C" void _cdecl myprint(int a)
{
printf("myprint %d\n",a);
}
在ASM中聲明 extern _myprint ,然后就可以用 push xxx ,call myprint , add esp ,4 調用了
。要注意的是call 調用完后,一定要加上add esp ,X 來平衡堆棧,應為C調用約定規定是調用者平衡堆棧.
2.遵守stdcall 調用約定
extern "C" void _stdcall myprintstdcall(int a)
{
printf("myprintstdcall %d\n",a);
}
在ASM中聲明extern _myprintstdcall@4 ,然后用push xxx ,call _myprintstdcall@4 調動,這里就不用再加add esp,X了,有函數本身平衡堆棧.
就這些了,都是個人總結,難免有不足與錯誤,還請大家指正.
posted on 2009-04-07 22:53
楊彬彬 閱讀(3927)
評論(1) 編輯 收藏 引用