2014-04-23 29 views
1

我正在编写一个运行在Cortex-m3上的程序。“svc”是否有任何gcc编译器原语?

起初我写了一个执行'svc'的程序集文件。

svc: 
    svc 0 
    bx lr 

我决定用gcc的内联汇编,所以我写了如下,但没有内联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没有,我该如何编写正确的?

+0

内联函数必须在头文件中声明(实现必须在编译时可用),我猜你没有做,因为你没有标记函数“内联”(因此会得到定义合并编译单元时出错) – IdeaHat

+0

@MadScienceDreams两者都在同一个编译单元中定义。即使它们不是,如果使用链接时间优化,也可以内联。我想这里的'inline'关键字不是解决方案。 – kukyakya

+0

编写汇编语言函数并汇编和链接它比处理编译器特定的内联汇编语句要简单得多。 svc需要一个立即的参数,所以你不能传递一个参数,除非你使用自我修改代码,否则它就是svc立即数。 –

回答

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)); 
} 

但是,在创建可变参数功能像这听起来很困难。