我开始学习汇编(在OSX上的NASM中为x86-64),现在正在探索函数的外观。
解释“调用约定”工作原理的大多数资源都按照以下方式显示示例:
// c code
MyFunction1(a, b);
// assembly code
main:
push a
push b
push rbp ; save frame pointer on stack
mov rsp, rbp ; save stack pointer in frame pointer
xor rax, rax ; set function return value to 0.
call _MyFunction
mov rbp, rsp ; restore stack pointer
pop rbp ; restore frame pointer
ret ; return to calling function
(我只是在合并了几种资源之后才做出的,所以可能有很多问题,但这不在主要问题之列。)
诸如cdecl调用约定之类的调用约定的要旨是:
因此,希望获得在汇编中使用堆栈和函数调用约定的更多实践经验,我希望看到现有的C编译器如何将函数调用转换为汇编(gcc和clang,这非常有用)。但是,我没有看到调用约定模式(到目前为止,我所见过的每个资源都说过这是做到这一点的方法)!
检查一下,这是从某些C生成的相对复杂的汇编代码:
https://gist.github.com/lancejpollard/a1d6a9b4820473ed8797
查看该C代码,有几个层次的嵌套函数调用。但是输出程序集代码未显示该推/弹出堆栈模式!
所以问题是,这些编译器是否只是为了优化汇编程序而避免这样做?(因为该示例C代码虽然具有一些嵌套函数,但仍然非常简单,因此我认为编译器可以预先计算很多东西)。还是我错过了什么?
一般来说:
static
而您正在创建一个目标文件),则编译器必须遵守调用约定(以便链接可以工作)。对于所有其他情况,编译器可以自由地完全忽略调用约定,并且可以做任何它认为更有效的事情(包括在寄存器中传递参数,而不使用堆栈或帧指针,还包括完全内联函数)。
然而:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句