您的位置:首页 > 其它

关于函数返回值的一点思考

2014-09-11 15:04 288 查看
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一下一目了然。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: