ARM/x86中全局变量(静态与非静态)对比

使用VS2005 编译,enable /TP 编译选项(Compile as C++ Code)/FA 编译选项. 文中描述的全局变量为非静态全局变量

C++ 代码:

         static int nsInitGlobal = 1;

static int nsUninitGlobal ;

 

int nInitGlobal = 1;

int nUninitGlobal ;

 

int _tmain (int argc , _TCHAR * argv [])

{

     return 0;

}

ARM4 对应汇编代码:

EXPORT     |?nUninitGlobal @@3HA| [ DATA ]       ; nUninitGlobal

  EXPORT    |?nInitGlobal @@3HA| [ DATA ]         ; nInitGlobal

 

  AREA |.bss|, NOINIT

|?nUninitGlobal @@3HA| % 0x4                 ; nUninitGlobal

 

  AREA |.data|, DATA

|nsInitGlobal | DCD 0x1

|?nInitGlobal @@3HA| DCD 0x1                 ; nInitGlobal

  EXPORT   |wmain|

 

  AREA |.pdata|, PDATA

|$T31408| DCD   |$LN5@wmain|

  DCD  0x40000904

  AREA |.text|, CODE, ARM

 

|wmain|     PROC

|$LN5@wmain|

  mov         r12, sp

  stmdb       sp!, {r0, r1}

  stmdb       sp!, {r12, lr}

  sub         sp, sp, #4

|$M31405|

  mov         r3, #0

  str         r3, [sp]

  ldr         r0, [sp]

  add         sp, sp, #4

  ldmia       sp, {sp, pc}

|$M31406|

  ENDP  ; |wmain|

  END

1.        可以看出全局变量在ARM 汇编下被用EXPORT 关键字标示,

EXPORT     |?nUninitGlobal @@3HA| [ DATA ]       ; nUninitGlobal

  EXPORT    |?nInitGlobal @@3HA| [ DATA ]         ; nInitGlobal

别的编译单元可以看见。静态全局变量不会用EXPORT 标示。

2.        初始化的全局变量存在于.data 段中,未初始化的全局变量存在于.bss 段中

3.        初始化的静态全局变量也在于.data 段中,但未初始化的静态全局变量没被使用,不会被分配空间

  X86 对应汇编代码:

PUBLIC    ?nUninitGlobal @@3HA                  ; nUninitGlobal

PUBLIC    ?nInitGlobal @@3HA                ; nInitGlobal

_BSS SEGMENT

?nUninitGlobal @@3HA DD 01H DUP (?)             ; nUninitGlobal

_BSS ENDS

_DATA    SEGMENT

_nsInitGlobal DD 01H

?nInitGlobal @@3HA DD 01H                  ; nInitGlobal

_DATA    ENDS

PUBLIC   _wmain

EXTRN    __RTC_Shutdown:PROC

EXTRN    __RTC_InitBase:PROC

;    COMDAT rtc$TMZ

rtc$TMZ  SEGMENT

__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown

rtc$TMZ  ENDS

;    COMDAT rtc$IMZ

rtc$IMZ  SEGMENT

__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase

; Function compile flags: /Odtp /RTCsu /ZI

rtc$IMZ  ENDS

;    COMDAT _wmain

_TEXT    SEGMENT

_argc$ = 8                           ; size = 4

_argv$ = 12                          ; size = 4

_wmain   PROC                        ; COMDAT

; Line 13

     push ebp

     mov  ebp, esp

     sub  esp, 192               ; 000000c0H

     push ebx

     push esi

     push edi

     lea  edi, DWORD PTR [ebp-192]

     mov  ecx, 48                     ; 00000030H

     mov  eax, -858993460                  ; ccccccccH

     rep stosd

; Line 14

     xor  eax, eax

; Line 15

     pop  edi

     pop  esi

     pop  ebx

     mov  esp, ebp

     pop  ebp

     ret  0

_wmain   ENDP

_TEXT    ENDS

END

1.        可以看出全局变量在x86 汇编下被用PUBLIC 关键字标示,

PUBLIC     ?nUninitGlobal @@3HA                  ; nUninitGlobal

PUBLIC     ?nInitGlobal @@3HA                ; nInitGlobal 别的编译单元可以看见。静态全局变量不会用 PUBLIC 标示。

2.        初始化的全局变量存在于.ata 段中,未初始化的全局变量存在于.bss 段(只是变量的声明, 不占用模块空间的

3.        初始化的静态全局变量也在于.data 段中,但未初始化的静态全局变量没被使用,不会被分配空间

 


版权声明:本文为CodeWilliams原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。