我编写空程序来惹恼stackoverflow程序员的地狱,不是.我正在探索gnu工具链.
现在以下对我来说可能太深了,但是为了继续执行空程序传奇,我已经开始检查C编译器的输出,GNU作为消耗的东西.
gcc version 4.4.0 (TDM-1 mingw32)
Run Code Online (Sandbox Code Playgroud)
test.c的:
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc -S test.c
.file "test.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
movl $0, %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
你能解释一下这里发生的事吗?这是我努力理解它.我使用了as手册和我的最小x86 ASM知识:
.file "test.c" 是逻辑文件名的指令..def:根据文档"开始定义符号名称的调试信息".什么是符号(函数名称/变量?)以及什么样的调试信息?.scl:docs说"存储类可以标记符号是静态的还是外部的".这是我从C中知道的静态和外部吗?什么是'2'?.type:存储参数"作为符号表条目的类型属性",我不知道..endef: 没问题..text:现在这是有问题的,它似乎是一个叫做section的东西,我已经读过它的代码所在,但是文档并没有告诉我太多. …我想知道谁会在objective-c中调用main方法?
我知道UIApplicationMain(nil,nil,nil,NSStringFromClass [Appdelgate类])方法是从main()方法调用,然后从appdelegate didFinishLaunchingWithOptions()方法继续处理.....
我也知道java中的main()方法是由JVM调用的,而进程是从main()方法继续进行的.
就像那样,我想知道谁会在objective-c中调用main().
感谢帮助
GCC编译(使用gcc --omit-frame-pointer -s):
int the_answer() { return 42; }
Run Code Online (Sandbox Code Playgroud)
成
.Text
.globl _the_answer
_the_answer:
subl $12, %esp
movl $42, %eax
addl $12, %esp
ret
.subsections_via_symbols
Run Code Online (Sandbox Code Playgroud)
什么是'$ 12'常数在这里做什么,'%esp'寄存器是什么?