Chinaunix首页 | 论坛 | 博客
  • 博客访问: 452009
  • 博文数量: 70
  • 博客积分: 3170
  • 博客等级: 中校
  • 技术积分: 756
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-06 16:47
文章分类

全部博文(70)

文章存档

2011年(22)

2010年(33)

2009年(5)

2008年(10)

分类: C/C++

2008-06-09 10:54:56

从汇编代码里看的应该清楚
#include
#include
struct aa {
        int b;
        int c;
};
struct aa fun(){
        struct aa b;
        return b;
}
void fun2(){
        struct aa c = fun();
}
int main(){
        fun2();
}

gcc -S后
.file   "returnstruct.c"
        .text
.globl fun
        .type   fun, @function
fun:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $16, %esp
        movl    8(%ebp), %ecx
        movl    -8(%ebp), %eax
        movl    -4(%ebp), %edx
        movl    %eax, (%ecx)
        movl    %edx, 4(%ecx)
        movl    %ecx, %eax
        leave
        ret     $4
        .size   fun, .-fun
.globl fun2
        .type   fun2, @function
fun2:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $28, %esp
        leal    -24(%ebp), %eax
        movl    %eax, (%esp)
        call    fun
        subl    $4, %esp
        movl    -24(%ebp), %eax
        movl    -20(%ebp), %edx
        movl    %eax, -8(%ebp)
        movl    %edx, -4(%ebp)
        leave
        ret
        .size   fun2, .-fun2
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $4, %esp
        call    fun2
        addl    $4, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-33)"
        .section        .note.GNU-stack,"",@progbits

注意看fun函数里的几句代理:
      movl    8(%ebp), %ecx
        movl    -8(%ebp), %eax
        movl    -4(%ebp), %edx
        movl    %eax, (%ecx)
        movl    %edx, 4(%ecx)
        movl    %ecx, %eax
以及 fun2的代码
可以很明显的看出这个简单的结构体的返回利用了堆栈
阅读(1466) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:产生RST包的各种原因

给主人留下些什么吧!~~