天天看點

vc++6.0 啟動代碼

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