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]
因此,我得到一個數據中止。
'ldr r3,[r3]'將'in'指針加載到'r3'中,下一行使用該指針來獲取'in-> b'。您沒有向我們展示如何設置傳遞給'test_func'的結構,這很難說出問題所在。 – Michael
你確定你爲'inner'和'outer'分配了內存嗎? –
@PaulR必須這樣,內存訪問衝突。 –