2016-09-20 73 views
1

我有以下代碼:大會,全局變量

const ClassTwo g_classTwo; 

void ClassOne::first() 
{ 
    g_classTwo.doSomething(1); 
} 

void ClassOne::second() 
{ 
    g_classTwo.doSomething(2); 
} 

將會產生以下objdump的:

void ClassOne::first() 
{ 
1089c50: e1a0c00d mov ip, sp 
1089c54: e92dd800 push {fp, ip, lr, pc} 
1089c58: e24cb004 sub fp, ip, #4 
1089c5c: e24dd008 sub sp, sp, #8 
1089c60: e50b0010 str r0, [fp, #-16] 
    g_classTwo.doSomething(1); 
1089c64: e59f3014 ldr r3, [pc, #20] ; 1089c80 <ClassOne::first()+0x30> 
1089c68: e08f3003 add r3, pc, r3 
1089c6c: e1a00003 mov r0, r3 
1089c70: e3a01001 mov r1, #1 
1089c74: ebffffe2 bl 1089c04 <ClassTwo::doSomething(int) const> 
} 
1089c78: e24bd00c sub sp, fp, #12 
1089c7c: e89da800 ldm sp, {fp, sp, pc} 
1089c80: 060cd35c .word 0x060cd35c 

01089c84 <ClassOne::second()>: 

void ClassOne::second() 
{ 
1089c84: e1a0c00d mov ip, sp 
1089c88: e92dd800 push {fp, ip, lr, pc} 
1089c8c: e24cb004 sub fp, ip, #4 
1089c90: e24dd008 sub sp, sp, #8 
1089c94: e50b0010 str r0, [fp, #-16] 
    g_classTwo.doSomething(2); 
1089c98: e59f3014 ldr r3, [pc, #20] ; 1089cb4 <ClassOne::second()+0x30> 
1089c9c: e08f3003 add r3, pc, r3 
1089ca0: e1a00003 mov r0, r3 
1089ca4: e3a01002 mov r1, #2 
1089ca8: ebffffd5 bl 1089c04 <ClassTwo::doSomething(int) const> 
} 
1089cac: e24bd00c sub sp, fp, #12 
1089cb0: e89da800 ldm sp, {fp, sp, pc} 
1089cb4: 060cd328 .word 0x060cd328 

兩種方法加載的g_classTwo與PC機相對於偏移地址:ldr r3, [pc, #20],對於第一種和第二種方法分別轉化爲0x060cd35c0x060cd328

即使它們都處理相同的全局變量,爲什麼地址不同?

這些地址與nm輸出的相同符號如何相關:07156fcc b g_classTwo

+0

爲了清楚起見,這兩個函數從不同的文字池中加載不同的地址。 (「轉化爲」並不是最清楚的描述,起初我以爲你只是說有兩個文字池和兩個相同指針的副本)。 –

+1

看看它在加載它們後立即對每個偏移量做什麼。 .. – Notlikethat

回答

2

ClassOne::first()您有:

1089c64: e59f3014 ldr r3, [pc, #20] ; 1089c80 <ClassOne::first()+0x30> 
1089c68: e08f3003 add r3, pc, r3 
1089c6c: e1a00003 mov r0, r3 
... 
1089c80: 060cd35c .word 0x060cd35c 

ClassOne::second()您有:

1089c98: e59f3014 ldr r3, [pc, #20] ; 1089cb4 <ClassOne::second()+0x30> 
1089c9c: e08f3003 add r3, pc, r3 
1089ca0: e1a00003 mov r0, r3 
... 
1089cb4: 060cd328 .word 0x060cd328 

在這兩種,r0this指針(g_classTwo)。如您所見,將文字池中的地址加載到r3之後,將其加總到pc以獲得r0

ClassOne::first(),你得到r0 = pc + r3 = 0x01089c70 + 0x060cd35c = 0x07156fcc

ClassOne::second(),你得到r0 = pc + r3 = 0x01089ca4 + 0x060cd328 = 0x07156fcc

所以對於this指針是0x07156fcc,這是g_classTwo的地址。

+0

你有PC值錯誤 - 他們將分別爲0x1089c70和0x1089ca4。這也與'g_classTwo'的地址已知爲0x07156fcc相關。 – Notlikethat

+0

@Notlikethat固定。我使用'PC-4'讓'LDR'感到困惑,爲什麼? –

+0

即時是_decimal_ 20,即0x14。 – Notlikethat