我正致力于编写在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没有,我该怎么写正确的?
答案 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));
}
但是,创建像这样的可变参数函数听起来很困难。