在 C 中调用函数到汇编

问题描述

如果我们有以下函数

int func(int n,float f,char* s,double* d);

Assembly函数调用将如下所示:

movl <n>,%ecx
movl <s>,%edx
pushl <d>
pushl <f>
call func

这是正确的吗?为什么是这个顺序?是因为每种类型的大小吗?

解决方法

对于已知的论点,从右向左或相反方向推的理由并不充分,因此这只是要遵循的惯例。

对于可变参数,以相反的顺序推送它们是有好处的,因为被调用者不知道传递了多少个参数。但第一个参数位于已知位置,即在返回地址之后。

因此,如果您考虑 printf 的示例:

 printf(FormatString,a1,a2,a3,a4);

所以 FormatString 现在处于已知位置,可以轻松找到通过堆栈的其他参数。

如果是相反的方式,那么被调用者需要获得一些额外的信息才能找到第一个参数,或者是一个指针,或者一个计数器或其他东西,告诉它在哪里找到格式字符串。