Mar
27
注:以下测试都是在Ubuntu 9.10 + Gcc 4.4下测试。
1.c
2.c
说明如果没有return语句,那么返回值应该是不确定的。
3.c
增加一个程序test.c
分别运行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 。
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
.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
.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;
}
#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 。
另外如果main中没有return貌似编译器会给warning吧。
PS:你也4.4了?编译的时候加了-std=gnu++0x没有?呵呵