我记得一些规则,从一个时间前(预32位的英特尔处理器),当是相当频繁地(至少对我来说)具有分析大会产生的输出的通过C/C++编译器(在我的情况下,Borland/涡轮增压在那段时间),以找到业绩的瓶颈,并安全地组合大会程序与C/C++编码。事情就像使用SI注册的 指针,斧头被用于回归的价值观,其寄存器应当保留一个大会惯例的回报,等等。

现在我想知道是否有一些参考的更受欢迎C/C++编(C++、海湾合作委员会、英特尔...)和加工(英特尔、手臂...),如果没有,在哪里找到的碎片,以创建一个。想法?

有帮助吗?

解决方案

您正在询问“应用程序二进制接口”。 (ABI)和召集公约。这些通常由操作系统和库设置,并由编译器和链接器强制执行。谷歌的“ABI”或“呼叫惯例”。 维基百科 Debian for ARM

其他提示

Agner Fog的“呼叫约定”文档总结了Windows和Linux 64和32位ABI,其中包括: http:// www .agner.org /优化/ calling_conventions.pdf 。有关寄存器使用的摘要,请参见第10页的表4。

个人经验中的一个警告:不要在内联汇编中嵌入关于ABI的假设。如果你在内联汇编中编写一个假定在特定寄存器中返回和/或参数传递的函数(例如eax,rdi,rsi),那么如果/当函数被编译器内联时,它将会中断。

开Watcom C/C++编译器支持的两个叫公约、基于登记的(默认)和堆为基础(非常接近的其他汇编者使用)。用户指南为这个编译器描述了他们两个是免费的 在线, 一起编译器 本身.你可以找到这些主题的用户指南中的特别是有帮助:

  • 10.4.1通过的参数使用基于登记的公约叫
  • 10.4.6使用堆基于呼吁公约
  • 10.5呼吁公约80x87基础的应用程序

好吧,今天如果打开优化,就没有了。但GCC允许您声明汇编指令应该使用特定变量,无论它是否在寄存器中,或者甚至强制GCC tu将该变量放入可用于您的指令的寄存器中。您还可以声明内联汇编块为自己保留哪些寄存器(因此,如果需要,编译器应在您的内联片段周围生成适当的保存/恢复代码)

我相信,但我不确定GCC是否使用 Itanium ABI 的大部分功能;它与它使用的ABI之间的不相容性是记录

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top