windows x64函數呼叫慣例(function call convention)

來源:互聯網
上載者:User
windows x64函數呼叫慣例(function call convention)Posted on December 28, 2009 by openwares

  借PC處理器架構由x86向x64過渡之機,MS清理了windows x64平台上的函數呼叫慣例,由原來的數種包括stdcall,thiscall,fastcall,cdecl,pascal等,統一為一種新的fastcall調用方式。這種調用方式得益於x64平台寄存器數量的增加。
  
  windows x64平台fastcall呼叫慣例的主要特性如下:

  • 前四個整型或指標型別參數由RCX,RDX,R8,R9依次傳遞,前四個浮點型別參數由XMM0,XMM1,XMM2,XMM3依次傳遞。
  • 調用函數為前四個參數在調用棧上保留相應的空間,稱作shadow space或spill slot。即使被呼叫者沒有或小於4個參數,調用函數仍然保留那麼多的棧空間,這有助於在某些特殊情況下簡化呼叫慣例。
  • 除前四個參數以外的任何其他參數通過棧來傳遞,從右至左依次入棧。
  • 由調用函數負責清理調用棧。
  • 小於等於64位的整型或指標類型傳回值由RAX傳遞。
  • 浮點傳回值由XMM0傳遞。
  • 更大的傳回值(比如結構體),由調用方在棧上分配空間,並有RCX持有該空間的指標並傳遞給被調用函數,因此整型參數使用的寄存器依次右移一格,實際只可以利用3個寄存器,其餘參數入棧。函數調用結束後,RAX返回該空間的指標。
  • 除RCX,RDX,R8,R9以外,RAX、R10、R11、XMM4 和 XMM5也是易變化的(volatile)寄存器。
  • RBX, RBP, RDI, RSI, R12, R14, R14, and R15寄存器則必須在使用時進行保護。
  • 在寄存器中,所有參數都是靠右對齊的。小於64位的參數並不進行高位零擴充,也就是高位是無法預測的垃圾資料。
x64 呼叫慣例概述
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.