vc++6.0 启动代码
--- crt0.c ---------------------------------------------------------------------------------------------------------------------------------
mainCRTStartup:
00408290 push ebp
00408291 mov ebp,esp
00408293 push 0FFh
00408295 push offset string "onexit.c"+10h (004313a0)
0040829A push offset __except_handler3 (0040e260)
0040829F mov eax,fs:[00000000]
004082A5 push eax
004082A6 mov dword ptr fs:[0],esp
004082AD add esp,0F0h
004082B0 push ebx
004082B1 push esi
004082B2 push edi
004082B3 mov dword ptr [ebp-18h],esp
004082B6 call dword ptr [__imp__GetVersion@0 (0043b164)] 调用GetVersion()函数,获取版本信息,返回值放在eax中
004082BC mov [__osver (00438914)],eax 版本信息保存在_osver变量中
004082C1 mov eax,[__osver (00438914)]
004082C6 shr eax,8
004082C9 and eax,0FFh
004082CE mov [__winminor (00438920)],eax
004082D3 mov ecx,dword ptr [__osver (00438914)]
004082D9 and ecx,0FFh
004082DF mov dword ptr [__winmajor (0043891c)],ecx
004082E5 mov edx,dword ptr [__winmajor (0043891c)]
004082EB shl edx,8
004082EE add edx,dword ptr [__winminor (00438920)]
004082F4 mov dword ptr [__winver (00438918)],edx
004082FA mov eax,[__osver (00438914)]
004082FF shr eax,10h
00408302 and eax,0FFFFh
00408307 mov [__osver (00438914)],eax
00408316 test eax,eax
00408318 jne mainCRTStartup+94h (00408324)
0040831A push 1Ch
0040831C call fast_error_exit (004083f0)
00408321 add esp,4
00408324 mov dword ptr [ebp-4],0
0040832B call _ioinit (0040dae0)
00408330 call dword ptr [__imp__GetCommandLineA@0 (0043b160)] 调用GetCommandLineA()函数获取命令行信息
00408336 mov [__acmdln (0043a2c4)],eax
0040833B call __crtGetEnvironmentStringsA (0040d8c0) 调用_crtGetEnvironmentStringsA()函数 获取环境变量信息
00408340 mov [__aenvptr (004388e4)],eax
00408345 call _setargv (0040d3b0)
0040834A call _setenvp (0040d260)
0040834F call _cinit (0040c6d0) 调用_cinit()用于全局数据和浮点寄存器的初始化。全局对象和IO流对象都是通过这个函数实现的。
00408354 mov ecx,dword ptr [__environ (00438930)]
0040835A mov dword ptr [___initenv (00438934)],ecx
00408360 mov edx,dword ptr [__environ (00438930)]
00408366 push edx
00408367 mov eax,[___argv (00438928)]
0040836C push eax
0040836D mov ecx,dword ptr [___argc (00438924)]
00408373 push ecx
00408374 call @ILT+10(_main) (0040100f) 调用main()主函数,开始用户程序,传递参数_argc,_argv_environ
00408379 add esp,0Ch
0040837C mov dword ptr [mainret],eax
0040837F mov edx,dword ptr [mainret]
00408382 push edx
00408383 call exit (0040c710)
$L17805:
00408388 mov eax,dword ptr [ebp-14h]
0040838B mov ecx,dword ptr [eax]
0040838D mov edx,dword ptr [ecx]
0040838F mov dword ptr [ebp-20h],edx
00408392 mov eax,dword ptr [ebp-14h]
00408395 push eax
00408396 mov ecx,dword ptr [ebp-20h]
00408399 push ecx
0040839A call _XcptFilter (0040d050)
0040839F add esp,8
--- crt0.c ---------------------------------------------------------------------------------------------------------------------------------
mainCRTStartup:
00408290 push ebp
00408291 mov ebp,esp
00408293 push 0FFh
00408295 push offset string "onexit.c"+10h (004313a0)
0040829A push offset __except_handler3 (0040e260)
0040829F mov eax,fs:[00000000]
004082A5 push eax
004082A6 mov dword ptr fs:[0],esp
004082AD add esp,0F0h
004082B0 push ebx
004082B1 push esi
004082B2 push edi
004082B3 mov dword ptr [ebp-18h],esp
004082B6 call dword ptr [__imp__GetVersion@0 (0043b164)] 调用GetVersion()函数,获取版本信息,返回值放在eax中
004082BC mov [__osver (00438914)],eax 版本信息保存在_osver变量中
004082C1 mov eax,[__osver (00438914)]
004082C6 shr eax,8
004082C9 and eax,0FFh
004082CE mov [__winminor (00438920)],eax
004082D3 mov ecx,dword ptr [__osver (00438914)]
004082D9 and ecx,0FFh
004082DF mov dword ptr [__winmajor (0043891c)],ecx
004082E5 mov edx,dword ptr [__winmajor (0043891c)]
004082EB shl edx,8
004082EE add edx,dword ptr [__winminor (00438920)]
004082F4 mov dword ptr [__winver (00438918)],edx
004082FA mov eax,[__osver (00438914)]
004082FF shr eax,10h
00408302 and eax,0FFFFh
00408307 mov [__osver (00438914)],eax
0040830C push 0
0040830E call _heap_init (0040e0e0)
调用_heap_init()函数 初始化堆空间 其中 参数0表示为单线程版本,1表示多线程
00408316 test eax,eax
00408318 jne mainCRTStartup+94h (00408324)
0040831A push 1Ch
0040831C call fast_error_exit (004083f0)
00408321 add esp,4
00408324 mov dword ptr [ebp-4],0
0040832B call _ioinit (0040dae0)
00408330 call dword ptr [__imp__GetCommandLineA@0 (0043b160)] 调用GetCommandLineA()函数获取命令行信息
00408336 mov [__acmdln (0043a2c4)],eax
0040833B call __crtGetEnvironmentStringsA (0040d8c0) 调用_crtGetEnvironmentStringsA()函数 获取环境变量信息
00408340 mov [__aenvptr (004388e4)],eax
00408345 call _setargv (0040d3b0)
0040834A call _setenvp (0040d260)
0040834F call _cinit (0040c6d0) 调用_cinit()用于全局数据和浮点寄存器的初始化。全局对象和IO流对象都是通过这个函数实现的。
00408354 mov ecx,dword ptr [__environ (00438930)]
0040835A mov dword ptr [___initenv (00438934)],ecx
00408360 mov edx,dword ptr [__environ (00438930)]
00408366 push edx
00408367 mov eax,[___argv (00438928)]
0040836C push eax
0040836D mov ecx,dword ptr [___argc (00438924)]
00408373 push ecx
00408374 call @ILT+10(_main) (0040100f) 调用main()主函数,开始用户程序,传递参数_argc,_argv_environ
00408379 add esp,0Ch
0040837C mov dword ptr [mainret],eax
0040837F mov edx,dword ptr [mainret]
00408382 push edx
00408383 call exit (0040c710)
$L17805:
00408388 mov eax,dword ptr [ebp-14h]
0040838B mov ecx,dword ptr [eax]
0040838D mov edx,dword ptr [ecx]
0040838F mov dword ptr [ebp-20h],edx
00408392 mov eax,dword ptr [ebp-14h]
00408395 push eax
00408396 mov ecx,dword ptr [ebp-20h]
00408399 push ecx
0040839A call _XcptFilter (0040d050)
0040839F add esp,8