64位程序 汇编 时的调用约定问题? [问题点数:100分]

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