使用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 段中,但未初始化的静态全局变量没被使用,不会被分配空间