2013-12-14 92 views
0

我的代碼如下:臂C代碼disasembly混亂,

struct inner{ 
    uint32_t a; 
    uint32_t b; 
}; 

struct outer{ 
    struct inner *in; 
}; 

void test_func(struct outer *o) 
{ 
    printh(o->in->b); 
} 

printh簡單顯示在hexformat值。 該代碼是符合下列標誌-DSMP -marm -mcpu =皮質-A15

的組件產生的,如下所示:

f0001cc0 <test_func>: 
f0001cc0:  e92d4800  push {fp, lr} 
f0001cc4:  e28db004  add  fp, sp, #4 
f0001cc8:  e24dd008  sub  sp, sp, #8 
f0001ccc:  e50b0008  str  r0, [fp, #-8] 
f0001cd0:  e51b3008  ldr  r3, [fp, #-8] 
f0001cd4:  e5933000  ldr  r3, [r3] 
f0001cd8:  e5933004  ldr  r3, [r3, #4] 
f0001cdc:  e1a00003  mov  r0, r3 
f0001ce0:  ebfffb04  bl  f00008f8 <printh> 
f0001ce4:  e24bd004  sub  sp, fp, #4 
f0001ce8:  e8bd8800  pop  {fp, pc} 

有了這個代碼我得到f0001cd8數據中止作爲R 3是在f0001cd4中加載0。但r3在f0001cd4中正確加載了地址o。 我只有一條簡單的線。我似乎不明白爲什麼會生成下面的指令

f0001cd4:  e5933000  ldr  r3, [r3] 

因此,我得到一個數據中止。

+1

'ldr r3,[r3]'將'in'指針加載到'r3'中,下一行使用該指針來獲取'in-> b'。您沒有向我們展示如何設置傳遞給'test_func'的結構,這很難說出問題所在。 – Michael

+2

你確定你爲'inner'和'outer'分配了內存嗎? –

+1

@PaulR必須這樣,內存訪問衝突。 –

回答

0
f0001cc0 <test_func>: 
f0001cc0:  e92d4800  push {fp, lr}   ;\ 
f0001cc4:  e28db004  add  fp, sp, #4   ;> create stack frame 
f0001cc8:  e24dd008  sub  sp, sp, #8   ;/ 
f0001ccc:  e50b0008  str  r0, [fp, #-8]  ; save first arg (o) in stack 
f0001cd0:  e51b3008  ldr  r3, [fp, #-8]  ; load o 
f0001cd4:  e5933000  ldr  r3, [r3]   ; load o->in 
f0001cd8:  e5933004  ldr  r3, [r3, #4]  ; load o->in->b 
f0001cdc:  e1a00003  mov  r0, r3    ; use as first arg to next fn 
f0001ce0:  ebfffb04  bl  f00008f8 <printh> ; call printh 
f0001ce4:  e24bd004  sub  sp, fp, #4   ;\ 
f0001ce8:  e8bd8800  pop  {fp, pc}   ;/ destroy stack frame 

上面(很明顯,沒有優化編譯)的代碼是第一裝載o->in,然後o->in->bo->in出現在0,這意味着你沒有爲它分配內存。