程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> visual studio-64位程序 匯編 時的調用約定問題? [問題點數:100分]

visual studio-64位程序 匯編 時的調用約定問題? [問題點數:100分]

編輯:編程綜合問答
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位遷移白皮書

zuishikonghuan
GKatHere
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved