当前位置:  编程技术>c/c++/嵌入式

从汇编看c++中变量类型的深入分析

    来源: 互联网  发布时间:2014-10-13

    本文导语:  全局变量的生命期和可见性是整个程序的运行期间,下面就来用汇编来看一下实际情况: c++源码: 代码如下:int i = 2;//全局变量 int main() {    int j = i;} 下面是汇编代码: 代码如下:PUBLIC    ?i@@3HA                      ...

全局变量的生命期和可见性是整个程序的运行期间,下面就来用汇编来看一下实际情况:

c++源码:

代码如下:

int i = 2;//全局变量

int main() {
    int j = i;
}

下面是汇编代码:

代码如下:

PUBLIC    ?i@@3HA                        ; i
_DATA    SEGMENT
?i@@3HA    DD    02H                    ; 全局变量i内存空间
_DATA    ENDS
PUBLIC    _main
; Function compile flags: /Odtp
; File c:usersadministratordesktopc++testa.cpp
_TEXT    SEGMENT
_j$ = -4                        ; size = 4
_main    PROC

; 3    : int main() {

    push    ebp
    mov    ebp, esp
    push    ecx;为局部变量分配4字节存储区

; 4    :     int j = i;

    mov    eax, DWORD PTR ?i@@3HA            ; 获取全局变量i的的值
    mov    DWORD PTR _j$[ebp], eax;eax存有i的值,将它赋给局部变量j

; 5    : }

    xor    eax, eax
    mov    esp, ebp;//栈顶指针恢复,释放为j分配的栈空间
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS


从汇编语言中可以看到,全局变量i的内存分配在内存中的数据区(由_DATA指定),因此在程序运行的过程中始终存在,所以对于程序中的所有部分都可以访问,而且随着程序的结束销毁;而局部变量j的内存是在运行main函数中在栈上动态分配,而且main函数结束后,此空间被释放,因此在main函数外面不能访问局部变量j。

实际上,在操作系统载入可执行文件的时候,它首先将数据区中的数据载入相应的内存,然后才开始运行程序,因此,全局变量产生在文件加载之后,第一条程序语言执行之前。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
  • linux中所用的汇编怎么和我们学的汇编不一样?
  • linux内核源代码中的汇编部分与其他汇编有不同的地方吗?
  • 有没有at@t汇编格式和intel 汇编格式互相转换的工具啊!
  • 请问有没有用AT&T汇编语法讲汇编语言的书?
  • gcc和objdump能生成Intel汇编吗?AT&T格式汇编看着不太习惯
  • 请教,X86汇编转AT&T汇编,急急
  • ARM汇编中的里的SUBS,后面的S是什么意思?顺便求本汇编的好书。
  • 如何将ARM汇编代码变成GNU汇编?
  • 高分求助:linux内核中的汇编语言和Dos或windows下的汇编是一样的吗,有这方面的书或资料可供学习吗,分不够可再加,决不食言
  • 强力推荐一本LINUX下汇编(即AT&T汇编)的新书
  • 请问一下,汇编器as是否就是gas?
  • 请问各位大虾,如何在linux环境下学习汇编?
  • GCC内联汇编如何调试
  • LINUX下的汇编 怎么看????高手指导语法
  • 请问汇编器和编译器各自完成那些功能啊?
  • 想学汇编
  • 编译、汇编、连接分别指代什么?
  • 关于gcc的汇编
  • linux汇编
  • 关于汇编


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3