X86调用约定

本條目描述x86架构微處理器调用约定。 调用约定描述了被调用代码的接口:

  • 原子(标量)参数或复杂参数独立部分的分配顺序
  • 参数是如何被传递的(放置在堆栈上,或是寄存器中,亦或两者混合)
  • 被调用者应保存调用者的哪个寄存器
  • 调用函数时如何为任务准备堆栈,以及任务完成如何恢复

这与编程语言中对于大小和格式的分配紧密相关。另一个密切相关的是名字修饰,这决定了代码中的符号名称如何映射到链接器中的符号名。调用约定,类型表示和名称修饰这三者的统称,即是众所周知的应用二进制接口(ABI)。

不同编译器在实现这些约定总是有细微的差别存在,所以在不同编译器编译出来的代码很难接合起来。另一方面,有些约定被当作一种API标准(如stdcall),编译器实现都较为一致。

历史背景

微型電腦出现之前,计算机厂商几乎都会提供一份操作系统和为不同编程语言编写的编译器。平台所使用的调用约定都是由厂商的软件实现定义的。

在Apple Ⅱ出现之前的早期微机几乎都是“裸机”,少有一份OS或编译器的,即是IBM PC也是如此。IBM PC兼容机的唯一的硬件标准是由Intel处理器(8086, 80386)定义的,并由IBM分发出去。硬件扩展和所有的软件标准(BIOS调用约定)都开放有市场竞争。

一群独立的软件公司提供了操作系统,不同语言的编译器以及一些应用软件。基于不同的需求,历史实践和开发人员的创造力,这些公司都使用了各自不同的调用约定,往往差异很大。

在IBM兼容机市场洗牌后,微软操作系统和编程工具(有不同的调用约定)占据了统治地位,此时位于第二层次的公司如Borland和Novell,以及开源项目如GCC,都还各自维护自己的标准。互操作性的规定最终被硬件供应商和软件产品所采纳,简化了选择可行标准的问题。

调用者清理

在这些约定中,调用者自己清理堆栈上的实参(arguments),这样就允许了可变参数列表的实现,如printf()

cdecl

cdecl(C declaration,即C声明)是源起C语言的一种调用约定,也是C语言的事实上的标准。在x86架构上,其内容包括:

  1. 函数实参在线程栈上按照从右至左的顺序依次压栈。
  2. 函数结果保存在寄存器EAX/AX/AL中
  3. 浮点型结果存放在寄存器ST0中
  4. 编译后的函数名前缀以一个下划线字符_
  5. 调用者负责从线程栈中弹出实参(即清栈)
  6. 8比特或者16比特长的整形实参提升为32比特长。
  7. 受到函数调用影响的寄存器(volatile registers):EAX、ECX、EDX、ST0 – ST7、ES、GS
  8. 不受函数调用影响的寄存器:EBX、EBP、ESP、EDI、ESI、CS、DS
  9. RET指令从函数被调用者返回到调用者(实质上是读取寄存器EBP所指的线程栈之处保存的函数返回地址并加载到IP寄存器)

Visual C++规定函数返回值如果是POD值且长度如果不超过32比特,用寄存器EAX传递;长度在33-64比特范围内,用寄存器EAX:EDX传递;长度超过64比特或者非POD值,则调用者为函数返回值预先分配一个空间,把该空间的地址作为隐式参数传递给被调函数。

GCC的函数返回值都是由调用者分配空间,并把该空间的地址作为隐式参数传递给被调函数,而不使用寄存器EAX。GCC自4.5版本开始,调用函数时,堆栈上的数据必须以16B对齐(之前的版本只需要4B对齐即可)。

考虑下面的C代码片段:

  int callee(int, int, int);
  int caller(void)
  {
      register int ret;
      
      ret = callee(1, 2, 3);
      ret += 5;
      return ret;
  }

在x86上, 会产生如下汇编代码(AT&T 语法):

        .globl  caller
  caller:
        pushl   %ebp
        movl    %esp,%ebp
        pushl   $3
        pushl   $2
        pushl   $1
        call    callee
        addl    $12,%esp
        addl    $5,%eax
        leave
        ret

在函数返回后,调用的函数清理了堆栈。 在cdecl的理解上存在一些不同,尤其是在如何返回值的问题上。结果,x86程序经过不同OS平台的不同编译器编译后,会有不兼容的情况,即使它们使用的都是“cdecl”规则并且不会使用系统调用。某些编译器返回简单的数据结构,长度大致占用两个寄存器,放在寄存器对EAX:EDX中;大点的结构和类对象需要异常处理器的一些特殊处理(如一个定义的构造函数,析构函数或赋值),存放在内存上。为了放置在内存上,调用者需要分配一些内存,并且让一个指针指向这块内存,这个指针就作为隐藏的第一个参数;被调用者使用这块内存并返回指针——返回时弹出隐藏的指针。 在Linux/GCC,浮点数值通过x87伪栈被推入堆栈。像这样:

        sub esp, 8      ; 给double值一点空间
        fld [ebp + x]   ; 加载double值到浮点堆栈上
        fstp [esp]      ; 推入堆栈
        call funct
        add esp, 8

使用这种方法确保能以正确的格式推入堆栈。 cdecl调用约定通常作为x86 C编译器的默认调用规则,许多编译器也提供了自动切换调用约定的选项。如果需要手动指定调用规则为cdecl,编译器可能会支持如下语法:

  return_type _cdecl funct();

其中_cdecl修饰符需要在函数原型中给出,在函数声明中会覆盖掉其他的设置。

syscall

与cdecl类似,参数被从右到左推入堆栈中。EAX, ECX和EDX不会保留值。参数列表的大小被放置在AL寄存器中[可疑]。 syscall是32位OS/2 API的标准。

参数也是从右到左被推入堆栈。从最左边开始的三个字符变元会被放置在EAX, EDX和ECX中,最多四个浮点变元会被传入ST(0)到ST(3)中——虽然这四个参数的空间也会在参数列表的栈上保留。函数的返回值在EAX或ST(0)中。保留的寄存器有EBP, EBX, ESI和EDI。 optlink在IBM VisualAge编译器中被使用。

被调用者清理

如果被调用者要清理栈上的参数,需要在编译阶段知道栈上有多少字节要处理。因此,此类的调用约定并不能兼容于可变参数列表,如printf()。然而,这种调用约定也许会更有效率,因为需要解堆栈的代码不要在每次调用时都生成一遍。 使用此规则的函数容易在asm代码被认出,因为它们会在返回前解堆栈。x86 ret指令允许一个可选的16位参数说明栈字节数,用来在返回给调用者之前解堆栈。代码类似如下:

 ret 12

pascal

基于Pascal语言的调用约定,参数从左至右入栈(与cdecl相反)。被调用者负责在返回前清理堆栈。 此调用约定常见在如下16-bit 平台的编译器:OS/2 1.x,微软Windows 3.x,以及Borland Delphi版本1.x。

register

Borland fastcall的别名。

stdcall

stdcall是由微软创建的调用约定,是Windows API的标准调用约定。非微软的编译器并不总是支持该调用协议。GCC编译器如下使用:

int __attribute__((__stdcall__ )) func()

stdcall是Pascal调用约定与cdecl调用约定的折衷:被调用者负责清理线程栈,参数从右往左入栈。其他各方面基本与cdecl相同。但是编译后的函数名前缀以下划线(_),其后缀以符号@及其参数所占的栈空间的字节长度。[1]寄存器EAX、ECX和EDX被指定在函数中使用,返回值放置在EAX中。stdcall对于微软Win32 API和Open Watcom C++是标准。

微软的编译工具规定:PASCALWINAPIAPIENTRYFORTRANCALLBACKSTDCALL__far __pascal__fortran__stdcall均是指此种调用约定。[2]

fastcall

此约定还未被标准化,不同编译器的实现也不一致。

Microsoft/GCC fastcall

Microsoft或GCC的__fastcall约定(也即__msfastcall)把第一个(从左至右)不超过32比特的参数通过寄存器ECX/CX/CL传递,第二个不超过32比特的参数通过寄存器EDX/DX/DL,其他参数按照自右到左顺序压栈传递。

Borland fastcall

从左至右,传入三个参数至EAX, EDX和ECX中。剩下的参数推入栈,也是从左至右。 在32位编译器Embarcadero Delphi中,这是缺省调用约定,在编译器中以register形式为人知。 在i386上的某些版本Linux也使用了此约定。

调用者或被调用者清理

thiscall

在调用C++非静态成员函数时使用此约定。基于所使用的编译器和函数是否使用可变参数,有两个主流版本的thiscall。 对于GCC编译器,thiscall几乎与cdecl等同:调用者清理堆栈,参数从右到左传递。差别在于this指针,thiscall会在最后把this指针推入栈中,即相当于在函数原型中是隐式的左数第一个参数。

微软Visual C++编译器中,this指针通过ECX寄存器传递,其余同cdecl约定。当函数使用可变参数,此时调用者负责清理堆栈(参考cdecl)。thiscall约定只在微软Visual C++ 2005及其之后的版本被显式指定。其他编译器中,thiscall并不是一个关键字(反汇编器如IDA使用__thiscall)。

WINAPI

WINAPI是平台的缺省调用约定。Windows操作系统上默认是StdCall;Windows CE上默认是Cdecl。

Intel ABI

根据Intel ABI,EAX、EDX及ECX可以自由在过程或函数中使用,不需要保留。

x86-64调用约定

x86-64调用约定得益于更多的寄存器可以用来传参。而且,不兼容的调用约定也更少了,不过还是有2种主流的规则。

微软x86-64调用约定

在Windows x64环境下编译代码时,只有一种调用约定,也就是说32位下的各种约定在64位下统一成一种了。

微软x64调用约定使用RCX、RDX、R8、R9四个寄存器用于存储函数调用时的4个参数(从左到右),使用XMM0、XMM1、XMM2、XMM3来传递浮点变量。其他的参数直接入栈(从右至左)。整型返回值放置在RAX中,浮点返回值在XMM0中。少于64位的参数并没有做零扩展,此时高位充斥着垃圾。

在微软x64调用约定中,调用者的一个职责是在调用函数之前(无论实际的传参使用多大空间),在栈上的函数返回地址之上(靠近栈顶)分配一个32字节的“影子空间”;并且在调用结束后从栈上弹掉此空间。影子空间是用来给RCX, RDX, R8和R9提供保存值的空间,即使是对于少于四个参数的函数也要分配这32个字节。

例如, 一个函数拥有5个整型参数,第一个到第四个放在寄存器中,第五个就被推到影子空间之外的栈顶。当函数被调用,此栈用来组成返回值——影子空间32位+第五个参数。

在x86-64体系下,Visual Studio 2008在XMM6和XMM7中(同样的有XMM8到XMM15)存储浮点数。结果对于用户写的汇编语言例程,必须保存XMM6和XMM7(x86不用保存这两个寄存器),这也就是说,在x86和x86-64之间移植汇编例程时,需要注意在函数调用之前/之后,要保存/恢复XMM6和XMM7。

System V AMD64 ABI

此约定主要在Solaris,GNU/Linux,FreeBSD和其他非微软OS上使用。头六个整型参数放在寄存器RDI, RSI, RDX, RCX, R8和R9上;同时XMM0到XMM7用来放置浮点变元。对于系统调用,R10用来替代RCX。同微软x64约定一样,其他额外的参数推入栈,返回值保存在RAX中。 与微软不同的是,不需要提供影子空间。在函数入口,返回值与栈上第七个整型参数相邻。

参考资料

  1. ^ /Gd, /Gr, /Gv, /Gz (Calling Convention). 2021-08-03 [2024-03-01]. (原始内容存档于2024-03-31) (美国英语). 
  2. ^ MSDN:Adjusting Calling Conventions. [2015-11-14]. (原始内容存档于2015-12-01). 

Read other articles:

Jhon Retei Alfri SandiLahir12 April 1970 (umur 53)Kuala Kapuas, Kalimantan Tengah, IndonesiaPekerjaanDosen, AkademisiOrganisasiUniversitas Palangka RayaSuami/istriTelhalia, M.Th., D.Th.Anak4 Dr. Jhon Retei Alfri Sandi, S.Sos., M.Si. (lahir 12 April 1970) adalah seorang dosen, akademisi, pengamat politik, dan tokoh pendidikan berkebangsaan Indonesia yang berkiprah di Kalimantan Tengah. Kehidupan awal Jhon Retei Alfri Sandi dilahirkan di Kuala Kapuas, Kalimantan Tengah, Indonesia. Ia anak...

 

Film komedi romantis atau romansa komedi (Inggris: romantic comedycode: en is deprecated , romcom) adalah film percintaan dengan alur cerita yang riang dan jenaka, berpusat pada kondisi ideal romantis, seperti misalnya kisah cinta sejati yang dapat mengatasi berbagai hambatan. Film komedi romantis adalah sub-genre film komedi dan film romantis. Contoh film yang termasuk genre ini adalah Valentine's Day (2010). Komedi romantis juga dapat digunakan untuk menggambarkan beberapa serial televisi. ...

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Desember 2023. Recep TopalInformasi pribadiLahir29 Oktober 1992 (umur 31)Tinggi169 cm (5,54 ft; 67 in) OlahragaNegaraTurkiOlahragaGulat amatirKelas berat61 kgLombaGaya bebas Rekam medali Gulat gaya bebas putra Mewakili  Turki Kejuaraan ...

Untuk senator negara bagian Oregon, lihat Lew Wallace (1889-1960). Lew Wallace Gubernur Teritorial New Mexico ke-11Masa jabatan1878–1881 PendahuluSamuel Beach AxtellPenggantiLionel Allen SheldonMenteri Amerika Serikat untuk Kekaisaran UtsmaniyahMasa jabatan1881–1885 PendahuluJames LongstreetPenggantiSamuel S. Cox Informasi pribadiLahirLewis Wallace10 April 1827 (1827-04-10)Brookville, IndianaMeninggalNot recognized as a date. Years must have 4 digits (use leading zeros for years <...

 

Ini adalah nama Minahasa, marganya adalah Lumintang Johny LumintangJohny Lumintang Duta Besar Indonesia untuk Filipina Masa jabatan14 Februari 2014 – 20 Februari 2018 PendahuluYohanes K. LegowoPenggantiSinyo Harry SarundajangGubernur Lemhannas ke-12Masa jabatan1999–2001 PendahuluAgum GumelarPenggantiErmaya Suradinata Informasi pribadiLahir28 Juni 1947 (umur 76)Noongan, Langowan Barat, Minahasa, SulawesiSuami/istridrg. Sonya Riupassa, M.H.A.AnakKitty LumintangDella Lumint...

 

Robert PattinsonRobert Pattinson, pada tahun 2017LahirRobert Thomas Pattinson13 Mei 1986 (umur 37)London, InggrisPekerjaanAktor, modelTahun aktif2004—sekarangSitus webRobertpattinson.comPattinson saat premier Twilight di Los Angeles Robert Douglas Thomas Pattinson[1][2] (lahir 13 Mei 1986)[3] adalah pemeran, model dan musisi Inggris,[4] terkenal dalam perannya sebagai Cedric Diggory dalam film Harry Potter and the Goblet of Fire.[5] Ia berm...

Main trans-national network organizationsIPACC logo Part of a series onIndigenous rights Rights Ancestral domain Intellectual property Land rights Language Traditional knowledge Treaty rights Water and sanitation Protection Governmental organizations ACHPR AID Arctic Council BIA CIP CIRNAC DTA FUNAI INPI JAKOA NCIP NIAA MCHTA TPK UNPFII NGOs and political groups AFN Amazon Conservation Team Amazon Watch CAP COICA CONAECDA CONAIE Cultural Survival EZLN fPcN IPACC IPCB IWGIA Land Back NARF ONIC...

 

Shriniwas Dadasaheb PatilShriniwas Dadasaheb Patil Gubernur SikkimPetahanaMulai menjabat 1 Juli 2013PendahuluBalmiki Prasad SinghPenggantiPetahanaAnggota Parlemen India untuk KaradMasa jabatan1999–2009PendahuluPrithviraj ChavanPenggantiPetahana Informasi pribadiLahir11 April 1941 (umur 83)Satara, MaharashtraPartai politikNCPSuami/istriRajanideviAnak2 putraTempat tinggalSataraPer tanggal 16 September, 2006Sumber: [1]Sunting kotak info • L • B Shriniwas Dadasaheb Patil ...

 

Questa voce sull'argomento stagioni delle società calcistiche italiane è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Voce principale: Nazionale Lombardia Foot-Ball Club. S.C. Italia S.C. Nazionale LombardiaStagione 1919-1920Sport calcio Squadra Nazionale Lombardia Allenatore Commissione Tecnica Presidente Giovanni Sfondrini[1] Prima Categoria5º nel girone C. 1918-1919 1920-1921 Si...

Friedhof St. Magdalena Der Friedhof St. Magdalena zählt zur Gruppe der Friedhöfe in Linz und liegt im Stadtteil St. Magdalena. Der Friedhof wird von der Pfarre St. Magdalena betrieben. Inhaltsverzeichnis 1 Geschichte 2 Gräber 3 Galerie 4 Weblinks Geschichte Der Friedhof ist seit dem 17. Jahrhundert erwähnt und befand sich wie in allen Dörfern Oberösterreichs um die Pfarrkirche. 1835 wurde der Friedhof an den heutigen Standort an der Oberbairinger Straße verlegt und wurde im Lauf der Z...

 

Association football club in England Football clubPadihamFull namePadiham Football ClubNickname(s)The StorksFounded1878; 146 years ago (1878)GroundArbories Memorial Sports Ground, PadihamCapacity1,688ChairmanShaun AstinManagerMichael MorrisonLeagueNorth West Counties League Premier Division2022–23North West Counties League Premier Division, 14th of 22 Home colours Away colours Padiham Football Club are an English football team based in Padiham, Lancashire. As of 2019–20,...

 

Ezgjan Alioski Alioski in azione con la Macedonia del Nord nel 2014 Nazionalità  Macedonia del Nord Altezza 172 cm Peso 69 kg Calcio Ruolo Centrocampista, difensore Squadra  Al-Ahli CarrieraGiovanili ????-2005 Flamatt2005-2013 Young BoysSquadre di club1 2013-2016 Sciaffusa87 (4)2016-2017 Lugano50 (19)2017-2021 Leeds Utd161 (21)2021-2022 Al-Ahli28 (6)2022-2023→  Fenerbahçe17 (1)2023- Al-Ahli4 (0)Nazionale 2009 Macedonia U-171 (0)2010-2012 ...

Enteng ng Ina MoPoster filmSutradaraTony Y. ReyesProduser Charo Santos-Concio Malou N. Santos Orlando R. Ilacad Antonio P. Tuviera Marvic Sotto Martina Eileen H. delas Alas SkenarioDanno Kristoper C. MariquitCeritaDanno Kristoper C. MariquitLawrence NicodemusPemeranVic SottoAi-Ai de las AlasPenata musikJessie LasatenSinematograferGary GardocePenyuntingCharliebebs GohetiaPerusahaanproduksi ABS-CBN Film Productions, Inc. OctoArts Films APT Entertainment M-Zet Productions DistributorStar C...

 

I Bolivarian GamesHost cityBogotáCountry ColombiaNations6Athletes716OpeningAugust 6, 1938 (1938-08-06)ClosingAugust 22, 1938 (1938-08-22)Opened byAlfonso López PumarejoMain venueEstadio El Campín1947/48 Lima → The I Bolivarian Games (Spanish: Juegos Bolivarianos) were a multi-sport event held between August 6–22, 1938, in Bogotá, Colombia, at the Estadio El Campín, for the city's 400th anniversary. The Games were organized by the Bolivarian...

 

CBS affiliate in Goldsboro, North Carolina For the radio station in New York City that held the callsign WNCN from 1957 to 1993, see WAXQ. Not to be confused with WCNC-TV, the NBC affiliate in Charlotte, North Carolina. WNCNGoldsboro–Raleigh–Durham–Fayetteville, North CarolinaUnited StatesCityGoldsboro, North CarolinaChannelsDigital: 8 (VHF)Virtual: 17BrandingCBS 17ProgrammingAffiliations17.1: CBSfor others, see § SubchannelsOwnershipOwnerNexstar Media Group(Nexstar Media Inc.)His...

Mathematical space with a notion of closeness In mathematics, a topological space is, roughly speaking, a geometrical space in which closeness is defined but cannot necessarily be measured by a numeric distance. More specifically, a topological space is a set whose elements are called points, along with an additional structure called a topology, which can be defined as a set of neighbourhoods for each point that satisfy some axioms formalizing the concept of closeness. There are several equiv...

 

This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Matariyyah – news · newspapers · books · scholar · JSTOR (June 2009) (Learn how and when to remove this message) Al-Matariyyah or Matariye, Mataria (Arabic: المطرية), is a village in South Lebanon near the Litani river. vte Sidon District, South GovernorateCapitalSidonTow...

 

Yu-Gi-Oh! Arc-V is the fourth spin-off anime in the Yu-Gi-Oh! franchise and the eighth anime series overall. It is produced by Nihon Ad Systems and broadcast by TV Tokyo. It is directed by Katsumi Ono and produced by Studio Gallop. Its plot focuses on Yuya Sakaki, who is a boy seeking to become the greatest entertainer in Action Duels who brings forth a new summoning method to Duel Monsters known as Pendulum Summoning. Currently, twelve pieces of theme music are used for the series: six open...

Electoral divisions of the parliament of the United Kingdom United Kingdom parliamentary constituenciesConstituencies after the 2023 Periodic ReviewCategoryElectoral districtLocationUnited KingdomNumber650 (as of 2023)GovernmentHouse of Commons This article is part of a series onPolitics of the United Kingdom Constitution Magna Carta Bill of Rights Treaty of Union (Acts of Union) Parliamentary sovereignty Rule of law Separation of powers Other constitutional principles The Crown The Monarch (...

 

مقاطعة جيبسون     الإحداثيات 38°19′N 87°35′W / 38.31°N 87.58°W / 38.31; -87.58   [1] تاريخ التأسيس 9 مارس 1813  سبب التسمية جون جيبسون  تقسيم إداري  البلد الولايات المتحدة[2]  التقسيم الأعلى إنديانا  العاصمة برنستون  التقسيمات الإدارية برنستون  خصائ...