Chapter 18 Runtime Environment
2020-03-02 本文已影响0人
再凌
C语言转化为汇编语言
1. 初始化static变量
2. 函数
函数部分分成三层: 前置操作,内容主题和清理操作。前之操作负责开辟内存(例如栈)。首先link
将栈和函数挂钩,然后存储一些信息----使用了哪些寄存器。
变量声明不会产生任何语句,除非初始化了。
如果寄存器数量不够的时候,后续变量就只能被放入内存中(有一个寄存器存放了指向这些地址的指针)
清理操作负责清理栈等内容
3. 函数调用
首先会根据调用的函数的需要的参数的逆序将参数放入栈中,即使传入了额外参数,被调用函数也不会使用。(反之,如果多传入了参数,那么被调用函数将错误接受参数)
4. 函数返回
首先将所有之前保存的栈都恢复出来,如果calling函数有赋值的话,则从寄存器中取出 return 的值
C语言调用汇编的注意事项
- 保存所有的寄存器内容
- 将需要传入的参数逆序压栈
- 如果汇编要返回值,应当放入某个临时寄存器
- return 之前,清空所有栈
调优
使用profile程序观察每一个函数总使用时长和被调用次数,找到最容易优化的部分。
小函数但是被调用多次的可以考虑使用汇编重构,因为汇编没有那么多的 prologue 和 epilogue