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

标签 linux assembly x86 mips

在 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/

相关文章:

linux - 平台驱动有什么用?

assembly - 汇编语言中的数字地址

x86 - 32位X86中局部变量和全局变量有什么区别?

c++ - SSE2 内在函数 - 比较无符号整数

java - 现代 linux 中 linux 关机/注销 TERM 信号处理程序的时间容差是多少?

linux - Q :/usr/bin/ld: cannot find -lGL

python - 在三星 chromebook 上编程

ios - 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

assembly - Nasm 中的不同类型的引语

linux - 是否有可能阻止任何人从 ELF 二进制文件中剥离调试符号(例如,标签)?