+ -
当前位置:首页 → 问答吧 → 局部变量和全局变量

局部变量和全局变量

时间:2011-12-17

来源:互联网


这是我反汇编的一个小程序
#include <iostream>
using namespace std;

int x = 5; //////全局变量对应的汇编代码是在哪?

int f()
{
00101A80 push ebp  
00101A81 mov ebp,esp  
00101A83 sub esp,0CCh  
00101A89 push ebx  
00101A8A push esi  
00101A8B push edi  
00101A8C lea edi,[ebp-0CCh]  
00101A92 mov ecx,33h  
00101A97 mov eax,0CCCCCCCCh  
00101A9C rep stos dword ptr es:[edi]  
  int x = 4;
00101A9E mov dword ptr [x],4  
  {
  extern int x;
  return x;
00101AA5 mov eax,dword ptr [x (107000h)]  
  }
}
00101AAA pop edi  
00101AAB pop esi  
00101AAC pop ebx  
00101AAD mov esp,ebp  
00101AAF pop ebp  
00101AB0 ret


就是局部变量和全局变量存在不同的地方在这些汇编代码中是如何体现出来的,大牛们帮忙解答下

作者: quan958201599   发布时间: 2011-12-17

00101A9E mov dword ptr [x],4 //这个是局部的x

00101AA5 mov eax,dword ptr [x (107000h)] //这个是全局的x
不知你用的什么编译器,感觉00101A9E生成的有些不对
局部的x应该在栈上的,一般应该是
  dword ptr [ebp-xx],4

作者: keiy   发布时间: 2011-12-17

帮顶下,实在有心无力!!

作者: whc262644839whc   发布时间: 2011-12-17

引用 1 楼 keiy 的回复:
00101A9E mov dword ptr [x],4 //这个是局部的x

00101AA5 mov eax,dword ptr [x (107000h)] //这个是全局的x
不知你用的什么编译器,感觉00101A9E生成的有些不对
局部的x应该在栈上的,一般应该是
dword ptr [ebp-xx],4


这里的x应该是一个方便阅读的汇编宏。我的vs2010有时候也这样写。

要想知道 全局变量在哪里?跟汇编一样啊。。。

int* p = &x;
加多这一句,运行到这里,然后在反汇编中,上面那里输入这个p的值,跳转到那里就可以看到他的汇编定义了。
你这里的仅仅是main函数里面的内容 

作者: mingliang1212   发布时间: 2011-12-17

引用 1 楼 keiy 的回复:
00101A9E mov dword ptr [x],4 //这个是局部的x

00101AA5 mov eax,dword ptr [x (107000h)] //这个是全局的x
不知你用的什么编译器,感觉00101A9E生成的有些不对
局部的x应该在栈上的,一般应该是
dword ptr [ebp-xx],4


我用的是vs2010
00101AA5 mov eax,dword ptr [x (107000h)] //这个是全局的x
为什么全局变量保存在了ax寄存器呢,如果声明很多全局变量那怎么办

作者: quan958201599   发布时间: 2011-12-17