代码之家  ›  专栏  ›  技术社区  ›  Fabio Ceconello

主要C/C++编译器生成的代码中的寄存器分配规则

  •  4
  • Fabio Ceconello  · 技术社区  · 16 年前

    指针,AX用于返回值,当程序集例程返回时应保留哪些寄存器,等等。

    现在我想知道是否有一些参考,为更流行的C/C++编译器(Visual C++,GCC,英特尔…)和处理器(英特尔,ARM,…),如果没有,在哪里找到的碎片创建一个。思想?

    5 回复  |  直到 16 年前
        1
  •  11
  •   Doug Currie    16 年前

    您询问的是“应用程序二进制接口”(ABI)和调用约定。这些通常由操作系统和库设置,并由编译器和链接器强制执行。谷歌的“ABI”或“呼叫约定”。一些起点来自 Wikipedia Debian for ARM .

        2
  •  4
  •   Emmet    12 年前

    Agner Fog的“调用约定”文档总结了Windows和Linux 64位和32位ABI: http://www.agner.org/optimize/calling_conventions.pdf . 寄存器使用汇总见第10页表4。

    个人经验中的一个警告是:不要在内联程序集中嵌入关于ABI的假设。如果您在内联汇编中编写一个函数,该函数假定在特定寄存器(例如eax、rdi、rsi)中进行返回和/或参数传输,则当编译器内联该函数时,该函数将中断。

        3
  •  1
  •   dmityugov    16 年前

    OpenWatcomC/C++编译器支持两种调用约定,基于寄存器(默认)和基于堆栈(与其他编译器使用的非常接近)。此编译器的用户指南介绍了这两种方法,并免费提供 online ,以及编译器 itself . 您可能会发现《用户指南》中的这些主题特别有用:

    • 10.4.1使用基于寄存器的调用约定传递参数
    • 10.4.6使用基于堆栈的调用约定
    • 10.5基于80x87的应用程序的调用约定
        4
  •  0
  •   seb seb    16 年前

    好吧,今天如果打开优化,就没有了。但GCC允许您声明您的汇编指令应该使用特定的变量,而不管它是否在寄存器中,或者甚至强制GCC将该变量放入可与您的指令一起使用的寄存器中。您还可以声明为自己注册内联程序块保留的寄存器(所以编译器应该在内联块周围生成适当的保存/恢复代码,如果需要的话)

        5
  •  0
  •   coppro    16 年前

    Itanium ABI 就其大部分功能而言;它和它使用的ABI之间的不兼容是 documented .