注:以下测试都是在Ubuntu 9.10 + Gcc 4.4下测试。

1.c
int main(){}
$ gcc -S 1.c
        .file   "1.c"
        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        popl    %ebp
        ret
        .size   main, .-main
        .ident  "GCC: (Ubuntu 4.4.1-4ubuntu9) 4.4.1"
        .section        .note.GNU-stack,"",@progbits


2.c
int main(){ return 0; }
$ gcc -S 2.c
        .file   "2.c"
        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        movl    $0, %eax
        popl    %ebp
        ret
        .size   main, .-main
        .ident  "GCC: (Ubuntu 4.4.1-4ubuntu9) 4.4.1"
        .section        .note.GNU-stack,"",@progbits

说明如果没有return语句,那么返回值应该是不确定的。

3.c
int main() {__asm__("movl    $0, %eax"); }

增加一个程序test.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int s = system("./1.exe");
    printf("return: %x\n", s);  //16进制输出
    return 0;
}


分别运行1.c 2.c 3.c编译后的可执行程序,可以发现,1.exe的返回值是不确定的,但末2位都是0; 2.exe的返回值总是0; 3.exe的返回值总是0 。如果修改2.c的return 0为return 1或2,又或者修改3.c里面的 $0 为 $1 或者 $2 ,可以发现返回值就变成了 100 和 200。这说明在x86下,主函数结束后会将返回值存放在EAX这个寄存器中。



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php