首页 > 解决方案 > 将 C 中的函数调用到程序集

问题描述

如果我们有以下功能:

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

对 in 函数的调用Assembly将是这样的:

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

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

标签: cassemblyx86calling-conventionfastcall

解决方案


对于已知的论点,没有强烈的令人信服的理由来推动从右到左或相反,所以这只是一个要遵循的惯例。

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

因此,如果您考虑以下示例printf

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

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

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


推荐阅读