【发布时间】:2014-01-24 13:14:17
【问题描述】:
我参加了华盛顿大学的硬件/软件接口课程。 在那门课程中,讲师解释了 x86-32 与 x86-64。 他展示了一个简单的反汇编函数,它进行了交换。
void swap(int *xp, int *yp)
{
int t0 = *xp;
int t1 = *yp;
*xp = t1;
*yp = t0;
}
在 x86-32 中,我可以看出参数是通过堆栈传递的,但在 x86-64 中,参数是通过寄存器传递的。
我可以看出,在 x86-32 中,参数是在 cdecl 调用约定中传递的,而 x86-64 是 fastcall 调用约定。
为什么会这样?一直都是这样吗?如果我选择传递多个寄存器参数会怎样?
【问题讨论】:
-
我认为寄存器的使用取决于所使用的编译器的实现——与操作系统架构无关。
-
所有这些不仅是特定于平台的,而且是非常特定于编译器的,并且很大程度上取决于优化。如果你有比可用寄存器更多的参数,那么一些(或全部)可能会在堆栈上传递。
-
@suspectus 处理器制造商通常会定义大多数编译器提供商遵循的约定,这允许互操作性(链接到使用不同编译器编译的库)。在给定硬件上存在不同约定的情况下,操作系统供应商倾向于指定一个约定,即使只是通过系统库隐式地指定。
-
@Gilles 有趣 - 感谢您的信息。
-
@Gilles 除了当他们像 ms 对无窗口 rtf 一样出错时!
标签: c assembly operating-system