64位程序已經拋棄了_stdcall, 等, 這個OK
但是在使用 ml64 進行匯編時, 似乎仍然使用的是stdcall;
如下:
// .asm
.CODE
Int_3 proc a:DWORD,b:DWORD,c:DWORD,d:DWORD
mov ebx,a
mov rax, 12345h
ret
Int_3 ENDP
END ; 文件結束
// .asm 編譯輸出
000000013F051020 push rbp
000000013F051021 mov rbp,rsp
000000013F051024 mov ebx,dword ptr [rbp+10h] // 為什麼調用以ecx傳遞, 而內部仍然用棧?
000000013F051027 mov rax,12345h
000000013F05102E leave
000000013F05102F ret
// .cpp
extern"C" void __stdcall Int_3(unsigned long a, long b, long c);
int _tmain(int argc, _TCHAR* argv[])
{
Int_3(10, 15, 16);
return 0;
}
// .cpp 編譯輸出(部分)
Int_3(10, 15, 16);
000000013F051061 mov r8d,10h
000000013F051067 mov edx,0Fh
000000013F05106C mov ecx,0Ah
000000013F051071 call @ILT+5(Int_3) (13F05100Ah)
問題有:
1: 引用聲明為3個參數, 而匯編原型為4個參數, 這樣竟然也可通過?
2: 64位調用采用了64位的調用法(_fastcall?),而匯編子程序對參數的使用仍然為_stdcall模式?
請教如何解決, 謝謝!
ps: 開發環境為vs c++
調用約定應該還可以用吧,調用約定只是調用者與被調用者關於參數傳遞,現場保護等的協議,你的程序裡面完全可以用stdcall啊
Windows平台,如果64位程序調用win32API的話,使用fastcall即可,具體可查詢msdn的64位遷移白皮書