基本上,我想知道的是 x86-64 操作系统如何运行为 x86 机器编译的代码。我知道当第一个 x64 系统被引入时,这不是其中任何一个的特性。在那之后,他们以某种方式设法做到了这一点。
请注意,我知道 x86 汇编语言是 x86-64 汇编语言的子集,并且 ISA 的设计方式使其可以支持向后兼容性。但是这里让我感到困惑的是堆栈调用约定。这些约定因架构而异。例如,在 x86 中,为了备份帧指针,进程会在它指向堆栈(RAM)的位置推送,并在完成后弹出。另一方面,在 x86-64 中,进程根本不需要更新帧指针,因为所有引用都是通过堆栈指针给出的。其次,虽然在 x86 架构中函数的参数是通过 x86-64 中的堆栈传递的,但寄存器用于此目的。
也许 x86-64 和 x64 体系结构的堆栈调用约定之间的这种差异可能不会影响程序堆栈的增长方式,只要不同时使用不同的约定,这主要是因为 x32 函数被其他 x32 调用并且相同对于 x64。但是,在某一时刻,一个函数(可能是一个系统函数)将调用一个函数,该函数的代码是为带有一些参数的 x86-64 机器编译的,此时,我很好奇操作系统(或其他一些控制单元)如何处理让这个功能工作。
提前致谢。