gpt4 book ai didi

linux - 为什么 x86 将参数放在堆栈上?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:56 24 4
gpt4 key购买 nike

在 MIPS 中,参数被放置在 $a0 到 $a4 寄存器中以加快访问速度。为什么一些 x86 架构设计选择将参数放在堆栈而不是寄存器中?这样做有什么好处?

最佳答案

真正的答案是它更多地依赖于编译器而不是处理器,尽管我怀疑 x86 编译器将参数压入堆栈如此普遍的原因是 x86 CPU 一直缺乏寄存器.当你删除保留寄存器时,你只剩下三个 - EAX、ECX 和 EDX,它们对应于原始 16 位 x86 指令集中的 AX、CX 和 DX。据我所知,英特尔系列中第一个提高该限制的处理器是 64 位“AMD”架构,它又增加了八个,编号为 R9 到 R15。五个保留寄存器获得了新名称,但它们仍然保留。

为了强化我关于它取决于编译器的断言,您只需看看 Microsoft .NET Framework 附带的 native 代码生成器,它展示了一种混合方法,其中前两个参数进入 ECX(或 RCX) ) 和 EDX(或 RDX),而其他参数进入堆栈。

即使在 Microsoft Visual C++ 编译器生成的 C/C++ 代码中,尽管最常见的调用约定 __cdecl 和 __stdcall 使用堆栈,但第三种调用约定 __fastcall 使用寄存器。此外,我还看到了同时使用两者的汇编代码;如果它需要与 C 对话,例程需要寄存器中的参数,但仅从库中的其他例程接收调用的私有(private)例程使用寄存器。

关于linux - 为什么 x86 将参数放在堆栈上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43727726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com