zoukankan      html  css  js  c++  java
  • [转组第8天] | 变量在内存中的位置和访问方式

    2018-05-05

    《C++反汇编和逆向技术》第七章  变量在内存中的位置和访问方式 读书笔记

      1.全局变量和局部变量的区别

      全局变量属于进程作用域,也就是说,在整个进程中都能够访问到这个全局变量。静态变量属于文件作用域,在当前源码文件内可以访问到;局部变量属于函数作用域,在函数内部可以访问到;在“{}”语句块内定义的变量,属于块作用域,只能在定义变量的“{}"快内访问到。

      全局变量在内存中的地支顺序是先定义的变量在低地址,后定义的变量在高地址。

      全局变量的特征如下:

      * 所在地址为数据区,生命周期与所在模块一致;

      * 使用立即数间接访问。//[g_nVar]

      局部变量的特征如下:

      * 所在地址为栈区,生命周期与所在的函数作用域一致;

      * 使用ebp或esp间接访问。

      2. 局部静态变量的工作方式

      静态变量分为全局静态变量和局部静态变量,全局静态变量和全局变量类似,只是全局静态变量只能在本文件内使用。但这只是在编译之前的语法检查过程中,对访问外部的全局静态变量做出的限制。全局静态变量的生命周期和全局变量也是一样的,而且在反汇编代码中它们也无二样。

      局部静态变量比较特殊,它不会随作用域的结束而消失,并且在未进入作用域之前就已经存在,其生命周期也和全局变量相同。局部静态常量会被预先被作为全局变量处理,而它的初始化部分只是在做赋值操作而已。

      局部静态变量只初始化一次,因为其有一个标志位,如果为0则赋值初始化,否则赋值。标志位大小为1个字节,可以表示8个局部静态变量的状态。

      如果初始化的数值为常量,即多次初始化也不会产生变化,编译器就直接采用全局变量方式处理,优化了代码,提升了效率。为了使其不超出作用域访问,使用名称粉碎法,在编译期将静态变量重新命名,在原有名称中加入其所在作用域以及类型等信息。

      3. 堆变量

      malloc与new实现堆空间的申请。

      free与delete完成对空间释放。

      堆空间的分配类似于商场中的商铺管理,malloc是从商场的空地中划分出一块作为商铺,而new则可以将划分好的商铺直接租用。由于malloc缺少商铺的营业范围规定,因此需要将申请好的堆强制转换以说明其类型方可使用,而new则无需这种操作,直接可以使用。

      在对数据末尾也加入了0xFDFDFDFD,这是向下越界的检查标志,这是程序编译方式为Debug版的重要特征之一。

  • 相关阅读:
    无法将类型为“xxxx”的对象强制转换为类型“Microsoft.SharePoint.WebPartPages.WebPart”。
    [win32 api] FindWindow FindWindowEx EnumChildWindows
    WPF线程中被修改后DataGrid数据不能及时更新的问题
    Android Adapter 与 Listview
    LINQ 查询操作及进行数据转换
    匿名方法lambda表达式
    WPF知识4 依赖属性
    LINQ 入门
    WPF绑定.NET对象(二)Visifire的数据绑定
    LINQ 查询操作中的类型关系
  • 原文地址:https://www.cnblogs.com/nww-570/p/8994639.html
Copyright © 2011-2022 走看看