arm c code disasembly令人困惑,

时间:2013-12-14 10:28:20

标签: arm inline-assembly

我在代码下方:

    struct inner{
    uint32_t a;
    uint32_t b;
};

struct outer{
    struct inner *in;
};

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

printh simple以hexformat显示值。 代码符合以下标志-DSMP -marm -mcpu = cortex-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上获得数据中止,因为r3在f0001cd4中加载了0。但是r3在f0001cd4中正确加载了o的地址。 我所拥有的只是一条简单的路线。我似乎不明白为什么生成以下指令

f0001cd4:       e5933000        ldr     r3, [r3]

因此我得到数据中止。

1 个答案:

答案 0 :(得分: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,表示你没有为它分配内存。