我在教自己的Linux汇编语言,我遇到了BSD和Linux之间的一个有趣的区别。 在Unix中,在调用80h中断之前,将系统调用参数压入堆栈; 相反,在Linux中,您将parameter passing到寄存器中。
有没有人知道Linux开发人员使用寄存器而不是栈的原理是什么?
注意:下面是一个详细说明这个区别的好页面: FreeBSD开发者手册:系统调用,而不解释原理。
系统调用约定是不同的,因为标准函数调用序列是不同的。 我假设你正在谈论x86-32调用约定和AMD64调用约定之间的区别。 你可以在这里查看AMD64 ABI。
但如果你想快速查看这个帖子。 基本上是关于速度。 通过改变调用约定和使用寄存器而不是栈,你可以删除序言和结尾处的指令。
您也可以使用一些32位代码的寄存器。 对于32位代码有几个调用约定:cdecl,stdcall,pascal和fastcall。 Windows和Linux对于32位代码使用相同的调用约定。 使用fastcall(GCC中的__attribute((fastcall)
)前两个整数参数(带有一些编译器的3)可以是寄存器,其他调用约定使用堆栈。
对于64位代码,Windows和Linux使用不同的调用约定。 Linux可以使用多达14个寄存器进行通话,Windows只能使用6个。 使用寄存器可以使代码更快。 这可能是一些64位代码与许多函数调用的O(10%)比相同的32位代码更快的原因的一部分。