C++中全局变量、静态变量、自动变量的在内存中的位置【DEBUG】
来源:互联网 发布:ip地址数据库下载 编辑:程序博客网 时间:2024/05/22 13:28
#include<iostream>
int globle = 0;
void main( ){
011E4C80 push ebp
011E4C81 mov ebp,esp
011E4C83 sub esp,0D8h
011E4C89 push ebx
011E4C8A push esi
011E4C8B push edi
011E4C8C lea edi,[ebp-0D8h]
011E4C92 mov ecx,36h
011E4C97 mov eax,0CCCCCCCCh
011E4C9C rep stos dword ptr es:[edi]
char local = 'a';; 定义的位于main函数中的自动变量
011E4C9E mov byte ptr [local],61h ;ESP = 0021FAFC EBP = 0021FBE0 local = 0021FBDBh ,可见local的地址位于main 函数的堆栈帧中。
{
int a =0; // 定义的位于代码块中的局部自动变量
011E4CA2 mov dword ptr [ebp-14h],0 ; ebp - 14h 位于main函数帧中,保存在栈里面
static int b =0;//定义的静态变量
again: b++;
011E4CA9 mov eax,dword ptr ds:[011EF21Ch] ; 此处表明 b 保存于数据段,属于静态存储区,不保存在main函数的栈帧里面
011E4CAE add eax,1
011E4CB1 mov dword ptr ds:[011EF21Ch],eax ; 执行b++ 操作
a++;
011E4CB6 mov eax,dword ptr [ebp-14h]
011E4CB9 add eax,1 ; 执行a++ 操作
011E4CBC mov dword ptr [ebp-14h],eax
if( b > 10) return ;
011E4CBF cmp dword ptr ds:[11EF21Ch],0Ah
if( b > 10) return ;
011E4CC6 jle again+21h (011E4CCAh)
011E4CC8 jmp again+23h (011E4CCCh)
}
goto again;
011E4CCA jmp again (011E4CA9h)
return;
}
011E4CCC xor eax,eax
011E4CCE pop edi
011E4CCF pop esi
011E4CD0 pop ebx
011E4CD1 mov esp,ebp
011E4CD3 pop ebp
int globle = 0;
void main( ){
011E4C80 push ebp
011E4C81 mov ebp,esp
011E4C83 sub esp,0D8h
011E4C89 push ebx
011E4C8A push esi
011E4C8B push edi
011E4C8C lea edi,[ebp-0D8h]
011E4C92 mov ecx,36h
011E4C97 mov eax,0CCCCCCCCh
011E4C9C rep stos dword ptr es:[edi]
char local = 'a';; 定义的位于main函数中的自动变量
011E4C9E mov byte ptr [local],61h ;ESP = 0021FAFC EBP = 0021FBE0 local = 0021FBDBh ,可见local的地址位于main 函数的堆栈帧中。
{
int a =0; // 定义的位于代码块中的局部自动变量
011E4CA2 mov dword ptr [ebp-14h],0 ; ebp - 14h 位于main函数帧中,保存在栈里面
static int b =0;//定义的静态变量
again: b++;
011E4CA9 mov eax,dword ptr ds:[011EF21Ch] ; 此处表明 b 保存于数据段,属于静态存储区,不保存在main函数的栈帧里面
011E4CAE add eax,1
011E4CB1 mov dword ptr ds:[011EF21Ch],eax ; 执行b++ 操作
a++;
011E4CB6 mov eax,dword ptr [ebp-14h]
011E4CB9 add eax,1 ; 执行a++ 操作
011E4CBC mov dword ptr [ebp-14h],eax
if( b > 10) return ;
011E4CBF cmp dword ptr ds:[11EF21Ch],0Ah
if( b > 10) return ;
011E4CC6 jle again+21h (011E4CCAh)
011E4CC8 jmp again+23h (011E4CCCh)
}
goto again;
011E4CCA jmp again (011E4CA9h)
return;
}
011E4CCC xor eax,eax
011E4CCE pop edi
011E4CCF pop esi
011E4CD0 pop ebx
011E4CD1 mov esp,ebp
011E4CD3 pop ebp
011E4CD4 ret
思考:1、从上面的反汇编代码可以看出,static b 变量保存在静态数据区,即使在main函数的栈帧被覆盖的时候,该数据不会消失,而 local 和 a 变量只是保存在main 函数的栈帧中,当main函数退出时,栈帧中的变量值很有可能被新的栈帧里面的数据覆盖。这也说明了为什么不同变量的作用范围是不同的。
2、 C++语言的常量在汇编代码里是怎样保存的?是保存在指令里面,还是保存在其它地方?(常量包括字面值和const 修饰的量)
3、从此处的反汇编代码中并没有看到全部变量globle 被初始化的代码,那么它又是在什么时候被初始化的,以及它在内存中存放的位置。
扩展阅读:http://dev.yesky.com/105/2030105.shtml
// source code
#include<iostream>int globle = 0;void main( ){char local = 'a';{ int a =0;static int b =0;again:b++;a++; if( b > 10) return ;}goto again;return;}
- C++中全局变量、静态变量、自动变量的在内存中的位置【DEBUG】
- 全局变量、局部变量在内存中的位置
- c中的变量在内存中存放的位置
- C语言中局部变量和全局变量在内存中的存放位置
- C语言中局部变量与全局变量在内存中的存放位置
- C语言中局部变量与全局变量在内存中的存放位置
- C语言中局部变量与全局变量在内存中的存放位置
- C语言中局部变量与全局变量在内存中的存放位置
- C++中的全局变量 局部变量 常量 静态变量的在内存中的分配
- 局部变量和全局变量在内存中的存储位置
- 程序代码,常量,局部变量,全局变量,在内存中的储存位置
- 程序代码,常量,局部变量,全局变量在内存中的保存位置
- 程序代码,常量,局部变量,全局变量在内存中的保存位置
- 程序代码,常量,局部变量,全局变量,在内存中的储存位置
- 局部变量和全局变量在内存中的存储位置
- 程序代码,常量,局部变量,全局变量,在内存中的储存位置
- 局部变量和全局变量在内存中的存储位置
- C++中的引用变量在内存中存放的位置
- linux遍历文件夹下的文件
- 发现一款感觉很不错的学英语软件:Rosseta Stone
- 一梦红尘,别问是劫是缘
- 判定一下设备是否为iphone5:
- J2EE (七) 配置文件详解以及dom4j进行解析
- C++中全局变量、静态变量、自动变量的在内存中的位置【DEBUG】
- 7款华丽的jQuery/CSS3效果及源码
- Software Craftsmanship: How to implement Open Closed Principle
- Automake stops with “non-POSIX variable name”
- DevPartner资源备忘
- 推荐12个漂亮的CSS3按钮实现方案
- dictionary用法(1)
- C#泛型详解
- Makefile中的wildcard用法