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 [[email protected] (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表示多線程
00408313 add esp,4
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 [[email protected] (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