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位迁移白皮书
https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention
Microsoft vectorcall