int sum(char *a)
{
int temp;
//计算过程略
return temp;
}
想必上面的那个函数是简单的不能再简单的教科书函数了,最近新来一个同事对这个返回temp提出了异议,栈上的资源,函数调用完毕后不是会被系统回收么?虽然这是一个很基础的问题,但一时半会儿也解释不清楚,因为用太多了,根本就不会去对这个提出质疑。对于函数我一直是这么认为的,拿上面的例子,比如int c = sum(s);那么我首先认为sum(s)它只是个值,然后它的具体数据取决于函数过程。好了,言归正传,既然有疑议,那么就深入浅出一下。
有写了如下代码:
#include <stdio.h>
int sum(int a,int b)
{
return a+b;
}
int main(int argc,char **argv)
{
int a=0;
int b=3;
int c = sum(a,b);
return 0;
}
将代码编译成汇编(gcc -S test.c -o test):
.file "test.c"
.text
.align 2
.global sum
.type sum, %function
sum:
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #12
str r0, [fp, #-8]
str r1, [fp, #-12]
ldr r2, [fp, #-8]
ldr r3, [fp, #-12]
add r3, r2, r3
mov r0, r3 //将相加值赋值于r0,r0即为返回值
add sp, fp, #0
ldmfd sp!, {fp}
bx lr
.size sum, .-sum
.align 2
.global main
.type main, %function
main:
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #16
mov r3, #0
str r3, [fp, #-8]
mov r3, #3
str r3, [fp, #-12]
ldr r0, [fp, #-8]
ldr r1, [fp, #-12]
bl sum
str r0, [fp, #-16] //上一过程中bl sum 已经将计算值赋值于r0中了
mov r3, #0
mov r0, r3
sub sp, fp, #4
ldmfd sp!, {fp, pc}
.size main, .-main
.ident "GCC: (Debian 4.6.3-14+rpi1) 4.6.3"
.section .note.GNU-stack,"",%progbits
从上面的汇编语言中可以清晰的看到,c=sum(a+b),先执行sum(a+b)计算得返回值存储于r0,再加r0中的值赋值于c,完成函数调用返回赋值过程。
有些东西太基础了,觉得理所应当,code一下一目了然。