局部静态变量的初始化观测
//全局变量
int global=0x11111;
int main(int argc, char* argv[])
{
//局部变量
int temp=0x160;
global=global+temp;
return 0;
}
6: int global=0x111111;
7: int main(int argc, char* argv[])
8: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,44h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-44h]
0040101C mov ecx,11h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
9: //局部变量
10: int temp=0x160;
00401028 mov dword ptr [ebp-4],160h
11:
12: global=global+temp;
0040102F mov eax,[global (00428a64)]
00401034 add eax,dword ptr [ebp-4]
00401037 mov [global (00428a64)],eax
13:
14: return 0;
0040103C xor eax,eax
15: }
0040103E pop edi
0040103F pop esi
00401040 pop ebx
00401041 mov esp,ebp
00401043 pop ebp
00401044 ret
可以查找到0040102F mov eax,[global (00428a64)]
我们可以很清楚地看到局部变量是直接保存在[ebp-4]也就是堆栈中的而全局变量则是保存在一个固定的内存地址00428a64里,同时在断点刚断下的时候,就是还没运行上面的代码时,观察[global (00428a64)]也就是全局变量地址里存储的内容时,可以看到我们全局变量已经初始化并被赋值了,观察整个main函数的反汇编代码,我们并没有看到全局变量赋值相关的语句,但这并不能说明程序在运行前就已经赋值了,别忘了也有可能是在mainCRTStartup中将这里初始化的,一打开程序全局变量就已经初始化了。
静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量
标签:初始化,局部变量,变量,静态,global,mov,int,全局变量 From: https://www.cnblogs.com/maqun/p/18474860