找出答案的简单方法是插入断点main()
并查看:
所以从技术上讲,这个问题的答案main()
是从一个叫做start
. 您没有获得 的源代码start
,但如果您愿意,可以在调试器中查看汇编代码。此版本来自为模拟器构建的代码:
0x1c30: pushl $0
0x1c32: movl %esp, %ebp
0x1c34: andl $-16, %esp
0x1c37: subl $16, %esp
0x1c3a: movl 4(%ebp), %ebx
0x1c3d: movl %ebx, (%esp)
0x1c40: leal 8(%ebp), %ecx
0x1c43: movl %ecx, 4(%esp)
0x1c47: addl $1, %ebx
0x1c4a: shll $2, %ebx
0x1c4d: addl %ecx, %ebx
0x1c4f: movl %ebx, 8(%esp)
0x1c53: movl (%ebx), %eax
0x1c55: addl $4, %ebx
0x1c58: testl %eax, %eax
0x1c5a: jne 0x00001c53 ; start + 35
0x1c5c: movl %ebx, 12(%esp)
0x1c60: calll 0x00001c70 ; main at main.m:9
0x1c65: movl %eax, (%esp)
0x1c68: calll 0x00002376 ; exit
0x1c6d: hlt
0x1c6e: nop
0x1c6f: nop
如果您创建一个 MacOS X 命令行程序并在 中放置一个断点main()
,您会发现它也在桌面上main()
被调用。start
Mac 版本的程序集start
并不完全相同,但非常接近。所以这是一个很好的猜测,它start
是编译器根据目标平台为你生成的,start
也是操作系统在启动程序时寻找的入口点。