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++

2个回答

调用约定应该还可以用吧,调用约定只是调用者与被调用者关于参数传递,现场保护等的协议,你的程序里面完全可以用stdcall啊
Windows平台,如果64位程序调用win32API的话,使用fastcall即可,具体可查询msdn的64位迁移白皮书

zuishikonghuan
zuishikonghuan 回复zuishikonghuan: 这是两个连接。https://msdn.microsoft.com/en-us/library/h2k70f3s.aspxhttps://msdn.microsoft.com/en-us/library/ms235286.aspx
大约 5 年之前 回复
zuishikonghuan
zuishikonghuan 回复GKatHere: 好像是这个吧,之前的我也找不到了,莫非msdn改版了。。https://msdn.microsoft.com/en-us/library/h2k70f3s.aspxhttps://msdn.microsoft.com/en-us/library/ms235286.aspx
大约 5 年之前 回复
GKatHere
GKatHere 如上, 64位中有一种vectorcall, 不过迁移白皮书, 有链接吗, 找不到
大约 5 年之前 回复
GKatHere
GKatHere 谢谢, 第二个解决.
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐