关于函数返回值的传递问题!
大家好!
小弟对于函数的返回值的传递有各种疑惑如下,请指教!
#1.
函数如下:
int fun2(void)
{
return 55;
}
gcc编译成.s后如下:
_fun2:
Leh_func_begin2:
pushq %rbp
Ltmp2:
movq %rsp, %rbp
Ltmp3:
movl $55, -8(%rbp)
movl -8(%rbp), %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
popq %rbp
ret
Leh_func_end2:
问题:为什么要把这个立即数连续两次在栈里操作,最后才放进EAX,这么做是为什么?
#2
返回值是包含9个整型的结构体,code如下:
typedef struct
{
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int i;
}ST_A;
ST_A fun3(void)
{
ST_A a;
a.a = 1;
a.b = 2;
a.c = 3;
a.d = 4;
a.e = 5;
a.f = 6;
a.g = 7;
a.h = 8;
a.i = 9;
return a;
}
gcc编译成.s后如下:
_fun3:
Leh_func_begin3:
pushq %rbp
Ltmp4:
movq %rsp, %rbp
Ltmp5:
movq %rdi, %rax
leaq -40(%rbp), %rcx
movl $1, -40(%rbp)
movl $2, -36(%rbp)
movl $3, -32(%rbp)
movl $4, -28(%rbp)
movl $5, -24(%rbp)
movl $6, -20(%rbp)
movl $7, -16(%rbp)
movl $8, -12(%rbp)
movl $9, -8(%rbp)
movl 32(%rcx), %edx
movl %edx, 32(%rdi)
movq 24(%rcx), %rdx
movq %rdx, 24(%rdi)
movq 16(%rcx), %rdx
movq %rdx, 16(%rdi)
movq (%rcx), %rdx
movq 8(%rcx), %rcx
movq %rcx, 8(%rdi)
movq %rdx, (%rdi)
movq %rax, -48(%rbp)
movq -48(%rbp), %rax
popq %rbp
ret
Leh_func_end3:
问题:在把所有立即数放进栈里的局部变量以后,后面的很晕啊,对指令和寄存器也不太熟,请指点下数据传递路径,最后放在RAX里的是地址对吧?
多谢!
[解决办法]
#1
可能编译器产生了临时变量,用不同的优化选项试试
#2
rcx是函数中对象的地址,
rdi临时返回对象地址,rax存放的是临时对象的地址