|
|
最近我在尝试写 Emacs 的扩展,用 C 完成。读过 Emacs 的源代码后发现,其中存在大量返回结构(或联合)类型的变量的函数。对此我不是很懂,遂用 GCC 试验了一下。如下代码:
- #include <stdio.h>
- struct abc
- {
- int x, y, z;
- };
- struct abc func1 (void)
- {
- struct abc r;
- r.x = 8, r.y = 7, r.z = 6;
- return r;
- }
-
- void func2 (struct abc v)
- {
- printf ("%d\n%d\n%d\n", v.x, v.y, v.z);
- }
- int main (int argc, char *argv[])
- {
- func2 (func1 ());
- return 0;
- }
复制代码
func1 将被编译为
- func1:
- pushl %ebp
- movl %esp,%ebp
- subl $24,%esp
- [color="Red"] movl 8(%ebp),%eax[/color]
- movl $8,-12(%ebp)
- movl $7,-8(%ebp)
- movl $6,-4(%ebp)
- movl -12(%ebp),%edx
- [color="Red"] movl %edx,(%eax)[/color]
- movl -8(%ebp),%edx
- [color="red"] movl %edx,4(%eax)[/color]
- movl -4(%ebp),%edx
- [color="red"] movl %edx,8(%eax)[/color]
- jmp .L6
- .L6:
- movl %eax,%eax
- leave
- ret $4
复制代码
其对应的调用处被编译为
- [color="red"] leal -12(%ebp),%eax[/color]
- addl $-12,%esp
- [color="red"] pushl %eax[/color]
- call func1
- addl $12,%esp
复制代码
从红色的部分可以看到,func1 是直接将要返回的值写入到了调用者的堆栈中。
有两点我不明白的地方:
1. movl %eax,%eax 的作用是什么?
2. 其他编译器是否也这样做?
欢迎就此展开讨论。 |
|