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

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

你可能感兴趣的:(逆向分析)