GKatHere 2015-08-07 02:03 采纳率: 100%
浏览 2160
已采纳

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条回答 默认 最新

  • zuishikonghuan 2015-08-08 15:30
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退