在主要C / C ++编译器生成的代码中注册分配规则
1537 观看
5回复
我记得一段时间以前的一些规则(32位以前的英特尔处理器),当时非常频繁(至少对我而言)必须分析C / C ++编译器生成的汇编输出(在我的例子中,当时是Borland / Turbo)找到性能瓶颈,并安全地将汇编例程与C / C ++代码混合。比如将SI寄存器用于this指针,AX用于返回值,当汇编例程返回时应保留哪些寄存器等。
现在我想知道是否有更多流行的C / C ++编译器(Visual C ++,GCC,Intel ......)和处理器(Intel,ARM,...)的参考,如果没有,在哪里找到要创建的部分一。想法?
作者: Fabio Ceconello 的来源 发布者: 2019 年 7 月 30 日回应 (5)
11像
您询问的是“应用程序二进制接口”(ABI)和调用约定。这些通常由操作系统和库设置,并由编译器和链接器强制执行。Google为“ABI”或“召集会议”。一些起点来自维基百科和Debian for ARM。
作者: Doug Currie 发布者: 01.11.2008 11:434像
1像
Open Watcom C / C ++编译器支持两种调用约定,基于寄存器(默认)和基于堆栈(非常接近其他编译器使用的)。该编译器的用户指南描述了它们,并且可以与编译器本身一起免费在线获得。您可以在“用户指南”中找到这些主题特别有用:
- 10.4.1使用基于寄存器的调用约定传递参数
- 10.4.6使用基于堆栈的呼叫约定
- 10.5基于80x87的应用程序的调用约定
0像
好吧,今天如果打开优化,那就没有了。但GCC允许您声明汇编指令应该使用特定变量,无论它是否在寄存器中,或者甚至强制GCC tu将该变量放入可用于您的指令的寄存器中。您还可以声明内联汇编块为自己保留哪些寄存器(因此,如果需要,编译器应在内联块周围生成适当的保存/恢复代码)
作者: seb 发布者: 01.11.2008 11:470像
来自类别的问题 :
- c++ 理解指针有什么障碍,克服它们可以做些什么?
- c++ 在C ++中解析INI文件的最简单方法是什么?
- c++ 什么时候应该在C ++中使用“朋友”?
- c++ 你如何清除stringstream变量?
- c 如何使用printf格式化unsigned long long int?
- c 如何实现延续?
- c How do you pass a function as a parameter in C?
- assembly x86中“非暂时”内存访问的含义是什么?
- assembly 你如何在gcc中从C / C ++源获得汇编程序输出?
- assembly 什么是好的C反编译器?
- assembly 在主要C / C ++编译器生成的代码中注册分配规则
- compiler-construction “文件末尾没有换行符”编译器警告
- compiler-construction 静态变量存储在C和C ++中的哪个位置?
- compiler-construction 用于Windows的C编译器?
- compiler-construction 如何设置共享ccache
- cpu-registers 在MIPS中,HI和LO是什么
- cpu-registers X在EAX,EBX,ECX ...中代表什么意思?
- cpu-registers 在哪里可以找到x86寄存器名称?