日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows中常用的函数调用规范

發布時間:2025/3/15 windows 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows中常用的函数调用规范 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考了《匯編語言 基于x86處理器》
轉載請注明出處
如果有錯誤的地方請指正,謝謝。

Windows環境中有32位調用規范和64位調用規范。

32位調用規范

Microsoft 32位編程環境下的32位調用規范有:_fastcall、_cdecl、_stdcall。

_fastcall

_fastcall使用寄存器加上堆棧傳參,如果參數兩個或兩個以下那么使用ECX或者EDX寄存器傳遞,參數有兩個以上則放入堆棧(從右向左入棧)。調用完畢后需要手動清棧(調用者清棧)。
優點是速度快,因為使用寄存器傳參。

_cdecl

又稱為C調用規范,采用堆棧傳參,主要用于C/C++語言默認的調用規范。參數從右向左入棧,調用完畢后手動清棧(調用者清棧)。
優點是:采用_cdecl調用方式的過程(函數/方法/子程序)可以傳遞多個參數,然后根據不同的參數個數發生變化。典型的例子就是 printf("%d,%d,%d",a,b,c) 函數。

缺點是:需要調用者清棧,如果參數太多可能忘記清理從而破壞堆棧。

_stdcall

常用于Win32API,采用堆棧傳參,參數從右向左入棧,調用完畢后自動清棧(被調清棧),
優點是:因為是自動清棧,不會因為參數過多而忘記清理堆棧。

缺點是:因為自動清棧是根據參數個數來實現的,所以傳遞的參數個數是確定的,無法像_cdecl那樣靈活。

64位調用規范

Microsoft 64位編程環境下的64位調用規范簡稱x64調用規范
和32位編程環境中的調用規范不一樣,在64位編程環境中C/C++/WindowsAPI函數統一使用x64調用規范,該調用規范的如下:

  • CALL指令將rsp寄存器 - 8用來存放CALL指令的下一條指令(返回地址),減8的原因是64位編程環境下的地址是64位的。
  • 前四個參數依次存入RCX、RDX、R8和R9寄存器。如果只有一個參數則放入RCX,還有第二個參數就放入RDX,以此類推。
  • 調用者還需要在運行時堆棧(也就是用來保存形參和局部變量的堆棧)至少分配32字節的影子空間。被調過程(函數/方法/子程序)就可以選擇將寄存器參數保存在這個區域中。
  • 在調用過程時,RSP必須對其16字節邊界(也就是16的倍數)。也就是說,CALL指令執行后(8字節返回地址),影子空間分配后(32字節),還需要將rsp - 8(對齊)。
  • 總結

    以上是生活随笔為你收集整理的Windows中常用的函数调用规范的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。