C++反汇编九(全局变量与局部变量)

时间:2022-12-27 10:29:31
00401020   push        ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-44h]
0040102C mov ecx,11h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi] // 初始化
10: int x=10;
00401038 mov dword ptr [ebp-4],0Ah //局部变量ebp-4赋值0xA(10)
11: static int y=x;
0040103F xor eax,eax
00401041 mov al,[`variant'::`2'::$S1 (00427c58)] // 全局变量初始化标志放入al(8位一个字节)
00401046 and eax,1 // 取全局变量初始化标志的最后一个字节
00401049 test eax,eax // 比较
0040104B jne variant+45h (00401065) // 已经初始化,则跳过初始化过程
0040104D mov cl,byte ptr [`variant'::`2'::$S1 (00427c58)]
00401053 or cl,1
00401056 mov byte ptr [`variant'::`2'::$S1 (00427c58)],cl // 没有初始化,则将初始化标志置位
0040105C mov edx,dword ptr [ebp-4]
0040105F mov dword ptr [__cfltcvt_tab+0AB4h (00427c54)],edx // 初始化标志置位后,将局部变量的值赋值给全局变量
12: static int z=g_x;
00401065 xor eax,eax
00401067 mov al,[`variant'::`2'::$S1 (00427c58)] // 全局变量初始化标志放入al(8位,一个字节)
0040106C and eax,2 // 取全局变量初始化标志的第二个字节,即第二个全局变量的初始化标志
0040106F test eax,eax // 判断
00401071 jne variant+6Eh (0040108e) // 已经被初始化,则直接跳出
00401073 mov cl,byte ptr [`variant'::`2'::$S1 (00427c58)]
00401079 or cl,2
0040107C mov byte ptr [`variant'::`2'::$S1 (00427c58)],cl // 否则将初始化标志置位
00401082 mov edx,dword ptr [g_x (00424a30)] // 全局变量放edx
00401088 mov dword ptr [__cfltcvt_tab+0AB0h (00427c50)],edx // 全局变量放到全局静态变量中
13: }
0040108E pop edi
0040108F pop esi
00401090 pop ebx
00401091 mov esp,ebp
00401093 pop ebp
00401094 ret