首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于函数返回值的传递有关问题

2012-06-14 
关于函数返回值的传递问题!大家好!小弟对于函数的返回值的传递有各种疑惑如下,请指教!#1.函数如下:int fun

关于函数返回值的传递问题!
大家好!
小弟对于函数的返回值的传递有各种疑惑如下,请指教!

#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存放的是临时对象的地址

热点排行