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