是否有“svc”的gcc编译器原语?

时间:2014-04-23 15:48:56

标签: c gcc arm cortex-m3

我正致力于编写在Cortex-m3上运行的程序。

起初我写了一个汇编文件来执行' svc'。

svc:
    svc 0
    bx lr

我决定使用gcc的内联asm,所以我写了如下,但svc函数没有内联。

__attribute__((naked))
int svc(int no, ...)
{
    (void)no;
    asm("svc 0\n\tbx lr");
}

int f() {
    return svc(0,1,2);
}

------------------ generated assembly ------------------
svc:
    svc 0
    bx lr
f:
    mov     r0, #0
    mov     r1, #1
    mov     r2, #2
    b       svc

我猜它没有内联,因为它是naked,所以我删除了naked属性并写了这样的内容。

int svc(int __no, ...)
{
    register int no asm("r0") = __no;
    register int ret asm("r0");
    asm("svc 0" : "=r"(ret) : "r"(no));
    return ret;
}

------------------ generated assembly ------------------
svc:
    stmfd   sp!, {r0, r1, r2, r3}
    ldr     r0, [sp]
    add     sp, sp, #16
    svc 0
    bx      lr
f:
    mov     r0, #0 // missing instructions setting r1 and r2
    svc 0
    bx      lr

虽然我不知道为什么gcc会添加一些不必要的堆栈操作,但svc是好的。问题是svc未正确内联,可变参数被删除。

gcc中是否有svc原语?如果gcc没有,我该怎么写正确的?

1 个答案:

答案 0 :(得分:0)

查看core_cmFunc.h中使用的语法,该语法是作为Cortex-M系列的ARM CMSIS的一部分提供的。这是一个将值写入优先级掩码寄存器的示例:

__attribute__ ((always_inline)) static inline void __set_PRIMASK(uint32_t priMask)
{
  __ASM volatile ("MSR primask, %0"::"r" (priMask));
}

但是,创建像这样的可变参数函数听起来很困难。