如何识别静态全局变量

    技术2022-05-20  54

    static CMyString test;

    无论是静态局部变量还是静态全局变量都可以被多次赋值 但只会被定义一次

    静态全局变量与静态局部变量的区别是他们的可活动期是不同的 意思就是作用域不同 但是他们的存在时间上是相同的 他们都是静态存储方式

     

    有了以上的理论支持就比较容易理解其汇编代码了

    Void main()

    {

    static CMyString test;

    }

    11:     static CMyString test;

    ;清空寄存器缓存

    0040111D   xor         eax,eax

    ;用来标记是否已定义

    0040111F   mov         al,[`main'::`2'::$S1 (00437088)]

    ;一下三句如果al有值则跳过对象定义的代码

    00401124   and         eax,1

    00401127   test        eax,eax

    00401129   jne         main+61h (00401151)

    ;对标记为开始赋值 然后定义对象

    0040112B   mov         cl,byte ptr [`main'::`2'::$S1 (00437088)]

    00401131   or          cl,1

    00401134   mov         byte ptr [`main'::`2'::$S1 (00437088)],cl

    0040113A   mov         ecx,offset ___mbcodepage+8 (00437070)

    0040113F   call        @ILT+45(CMyString::CMyString) (00401032)

    00401144   push        offset $E2 (004170a0)

    00401149   call        atexit (00401250)

    0040114E   add         esp,4

    00401151   ……

    总结

    静态变量的定义可以归纳为如下

    判断该变量对应标记位是否有值 –>(已定义)à开始其他代码

    没有值à为标记位赋值à定义变量

     


    最新回复(0)