c - 将 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
这个对吗?为什么是这个顺序?是因为每种类型的大小吗?
解决方案
对于已知的论点,没有强烈的令人信服的理由来推动从右到左或相反,所以这只是一个要遵循的惯例。
对于可变参数,以相反的顺序推送它们是有好处的,因为被调用者不知道传递了多少参数。但第一个参数位于一个已知位置,即在返回地址之后。
因此,如果您考虑以下示例printf
:
printf(FormatString, a1, a2, a3, a4);
所以FormatString
现在处于已知位置,并且可以轻松找到通过堆栈的其他参数。
如果反过来,那么被调用者需要获取一些额外的信息才能找到第一个参数,无论是指针,还是计数器或其他东西,它告诉它在哪里找到格式字符串。
推荐阅读
- java - 我正在尝试访问禁用右键单击的安全网站。通过使用 selenium Xpath 不能点击元素
- c# - 当数据已经在调试中显示时,在运行时附加数据会引发空异常
- java - 有什么方法可以限制 POJO 中字符串的大小并在超出限制时抛出特定异常?
- ios - 如何在 EventKit(swift 4)中添加正确的事件时间?
- python-3.x - 如何减小直方图的宽度?
- excel - 根据另一列顺序对列进行排序
- docker-compose - docker-compose 卷未正确安装
- powershell - 将 pscustomobject 转换为 Json 格式
- python - Python - ValueError:解包的值太多(预期 2)
- python - 获取python 2d列表中2点之间对角线上的点列表