【发布时间】:2016-03-12 08:50:02
【问题描述】:
我有一个关于 ARM 内联汇编代码的问题。我正在尝试从裸函数调用函数,如下所示。它意外地重新排序了代码。
extern void func_b();
__attribute__((naked)) static void func_a(void)
{
asm volatile ( "push {r0-r7, lr}" );
asm volatile ( "bl %0" : : "r"(func_b) );
asm volatile ( "pop {r0-r7, lr}\n"
"subs pc, lr, #4" );
}
我得到以下汇编代码:
305c: f642 20c7 movw r0, #10951 ; 0x2ac7
3060: b5ff push {r0, r1, r2, r3, r4, r5, r6, r7, lr}
3062: f2c0 0000 movt r0, #0
3066: 4780 bl r0
3068: e8bd 40ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, lr}
306c: f3de 8f04 subs pc, lr, #4
我想要的代码应该是:
305c: b5ff push {r0, r1, r2, r3, r4, r5, r6, r7, lr}
305e: f642 20c7 movw r0, #10951 ; 0x2ac7
3062: f2c0 0000 movt r0, #0
3066: 4780 bl r0
3068: e8bd 40ff ldmia.w sp!, {r0, r1, r2, r3, r4, r5, r6, r7, lr}
306c: f3de 8f04 subs pc, lr, #4
我已经尝试过 asm volatile ( "" ::: "memory" );编译器障碍,但它不起作用。
【问题讨论】:
-
@Notlikethat 谢谢指点!