- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白在RAX中不传递参数有什么好处,
由于返回值在RAX中,因此无论如何被调用者都会破坏它。
有人可以解释吗?
最佳答案
x86-64 System V确实将AL用于可变参数功能:调用方传递XMM寄存器中FP arg的数量。
(这只是一个优化,允许被调用者不将所有向量regs转储到数组中;允许AL中的数字大于FP args的数目。实际上,gcc的可变参数函数的代码源只是检查是否它是非零值,并且不转储xmm0..7的任何一个或全部8。我认为ABI保证即使实际上没有任何FP args始终通过al=8
是安全的,并且您不能通过传递FP args在堆栈上,而不是通过设置al=0
但是,为什么不使用r9b
并使用RAX作为第六个arg?还是使用RAX来获取更早的arg?
因为RAX在x86中有很多隐式用法,并且在设计调用约定(http://web.archive.org/web/20140414124645/http://www.x86-64.org/pipermail/discuss/2000-November/001257.html)时进行的实验发现,使用RAX往往需要在调用者或被调用者中附加指令。例如因为通常需要RAX作为调用程序中计算其他arg的一部分,或者在代码使用RAX中传递的arg之前,与其他arg中的一个做某事时需要RAX。
RAX用于rep stos
(gcc曾经更积极地用于内联memset),它用于div
和加宽(单操作数)mul
/ imul
,gcc用于编译除法时间常数。 (Why does GCC use multiplication by a strange number in implementing integer division?)。
其他大多数RAX特殊用途只是对其他寄存器(例如cdqe
与movsxd rax, eax
(或在任何其他寄存器之间))也可以进行的简短编码。或add eax,imm32
(无ModRM)对比add r/m32, imm32
(或大多数其他ALU指令)。看到我的答案之一
Tips for golfing in x86/x64 machine code。最初的8086缺少许多更长的非AX替代方案,但在8086和386之间,添加了imul r32,r32
和movsx
/ movzx
之类的东西。其他仅用于RAX的指令在优化速度时不值得使用(例如xlatb
,lodsd
),或者被P6 / AMD64扩展已废弃(lahf
作为FP的一部分,被fucomi
和使用SSE废弃了) / SSE2 ucomisd
(用于FP数学),或者是cmpxchg
或cpuid
这样的专用指令,它们很少见,不会影响调用约定设计。编译器始终未使用aaa
之类的BCD指令,而AMD64删除了它们。
x86-64 System V调用约定(主要是Janargička用于整数arg传递寄存器设计)的设计人员通常旨在避免使用具有许多/常见隐式用法的寄存器。 rdx
按arg传递顺序排在rcx
之前,因为可变移位计数(无BMI2)需要cl
。这些可能比mul
和div
更常见,因为2操作数imul reg,reg
允许正常的非扩展乘法而不会破坏RDX:RAX。
选择rdi
和rsi
作为前两个args显然是由于将memset
或memcpy
内联为rep movs
(gcc早在2000年就已经采用了,尽管实际上并不是一个好选择)。在许多情况下,gcc都这样做了)。即使rep
-string指令使用RCX作为计数器,他们仍然发现平均保存的指令可以通过RDX而不是RCX传递RDX中的第三个arg,因此对于memcpy
为< cc> / rep stosb
。
JanHubička通过使用当时最新版本的x86-64 gcc编译SpecInt来评估arg传递寄存器的多种变化。有关更多详细信息和链接,请参见我在Why does Windows64 use a different calling convention from all other OSes on x86-64?上的答案。
他评估的arg-register指令之一是ret
,但他发现该指令不如其他选项好。 (请参阅上面链接的邮件列表消息)。
RISC调用约定在第一个返回值寄存器中传递第一个arg是相当普遍的。 ARM这样做(RAX, RDX, RCX, RBX, RSI, RDI
),我认为PowerPC也是。其他(如MIPS)则不然。但是所有这些架构都没有对大多数整数寄存器的隐式使用,通常只是链接寄存器,也许还有堆栈指针。
x86-64 SysV和Windows对FP args执行此操作:xmm0用于传递和返回。
关于x86-64 - 为什么不使用RAX在System V AMD64 ABI中传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52714408/
我是 Linux 系统编程新手,在阅读时遇到了 API 和 ABILinux系统编程。 API定义: An API defines the interfaces by whichone piece o
ABI 标准中与内存布局相关的规范是否通常仅适用于 ABI 边界,或者也适用于例如在翻译单元中,或者如果不是这种情况,编译器通常会做出这样的额外保证吗? 如果“一般”太宽泛,请考虑例如带有 Syste
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
当我尝试使用调试配置在 QtCreator 中运行我的项目时,出现以下错误: 我什至不知道 ABI 是什么。我应该检查哪些设置?可能出了什么问题? 这是我的“桌面”配置: 当我将其悬停时,QtCrea
什么是 ABI,为什么 C++ 没有标准的 ABI,如果有它为什么重要? 最佳答案 ABI 是一个 Application Binary Interface .它描述了如何组织和访问应用程序二进制文件
Fatal Error: Mismatch between the program and library build versions detected. The library used 3.0
我上次在 Android Studio 中将 NDK 版本升级到最新版本后遇到了这个问题。我还找到了解决此问题的解决方案。如果有人有这个问题,我希望这是对你最好的问题和答案。请检查我的答案。 最佳答案
是否可以在没有源代码的情况下获取已知合约地址的ABI? 我发现的唯一方法是使用 etherscan 的 API,但它仅适用于经过验证的合约。 最佳答案 简单的回答:不 长答案:也许吧。 ABI 是从源
不解决 C++ 某些问题的常见解释是它会破坏 ABI 并需要重新编译,但另一方面,我遇到了这样的语句: Honestly, this is true for pretty much all C++ n
我想知道 C 头文件和 ABI 之间的关系。各种类型的大小是体系结构甚至依赖于编译器的。那么如何才能可靠地链接到 C 库呢? 对于一个更具体的问题:当使用 Haskell 的 FFI 时,甚至只使用像
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
问题: 在使用 Android Studio 时,我无法在 HTC One M7 或任何模拟器上安装我的应用程序。在升级到 5.0.2(从 4.4?)之前,它运行良好。我收到的错误消息是 INSTAL
前言:这个问题已经过时了。 在创建 Android 虚拟设备 (AVD) 时,可以选择 CPU/ABI。我已经尝试了所有可用的目标——除了 ARM 别无选择。我的目标是 Android 3.2。 我假
标题说明了一切。我将向具有默认值的类的成员函数添加一个参数。该参数属于非平凡类型。这会破坏 ABI 吗?假设我的新库版本将是 M.m.0,它应该可以作为所有使用 M.m-1.x 的链接应用程序的直接替
我有一个配置探测器,它根据平台和版本确定要传递给 g++ 的标志。我通常使用比 native 安装版本更高版本的 gcc,以便访问 C++14 功能。在较旧的平台上,这意味着我需要添加 -D_GLIB
我看到很多关于 C++ 没有标准 ABI 的讨论,就像 C 一样。我很好奇究竟是什么问题。到目前为止,我想出了 名称修改 异常处理 RTTI 还有其他与 C++ 相关的 ABI 问题吗? 最佳答案 在
我正在使用 ethers-rs 编写一个 defi 应用程序。我需要计算 Rust 中的 CREATE2 地址。我在 Rust 中找不到与 abi.encodePacked(token0, token
尝试使用此 setup.py 从空项目创建轮子: 设置.py from setuptools import setup setup(name='bla', version='1') 我调用 pytho
使用 Android Gradle Experimental 插件版本 0.9.1。我需要为每个 ABI 设置不同的静态库搜索路径,有什么方法可以实现吗? 这里是 build.gradle fragm
假设我们有一个接受或返回某种标准类的共享库: //lib.h #include std::vector returnSomeInts(); //lib.cpp #include "lib.cpp"
我是一名优秀的程序员,十分优秀!