GKatHere
GKatHere
采纳率100%
2015-08-07 02:03 阅读 2.1k

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

6

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

相关推荐