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

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一下一目了然。




猜你喜欢

转载自blog.csdn.net/fenglifeng1987/article/details/39206259