AT&T汇编函数是如何声明的?
很简单用.type命令来创建函数的标签,如下:
.type fun1, @function
fun1:
保存寄存器等值。
函数体
ret
Ps:函数一开始可以使用finit命令来清空FPU寄存器。
还有pusha和popa很方便的让你全部的寄存器值一次性都保存在堆栈中和取出
那么如何访问汇编函数呢?
直接call+函数标签 就OK了。
函数调用是如何传值的?
通过栈和寄存器。注意如果是寄存器的话,那么类型必须相同,所以我估计在类型不同的时候如果进行进行不同类型传值,强制类型转换是在传值之前就已经解决了的。
至于到低是怎么传值的,按照C样式来的话,从参数从右到左入栈。
这也就解释了为什么
Int a;
f(a++,++a);
第一个参数会是2.应该是通过从右到左边解析表达式,然后入栈的。
注意不光存储传递的值,还要保存调用函数处的地址。
所以栈中就像下面这样:
函数参数。。 |
函数参数2 |
函数参数1 |