标题:主函数main的返回值 出处:Felix021 时间:Sat, 27 Mar 2010 15:47:33 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1872 内容: 注:以下测试都是在Ubuntu 9.10 + Gcc 4.4下测试。 1.cint 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.cint 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.cint main() {__asm__("movl $0, %eax"); } 增加一个程序test.c#include #include 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这个寄存器中。 Generated by Bo-blog 2.1.0