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没有,我该如何编写正确的?
内联函数必须在头文件中声明(实现必须在编译时可用),我猜你没有做,因为你没有标记函数“内联”(因此会得到定义合并编译单元时出错) – IdeaHat
@MadScienceDreams两者都在同一个编译单元中定义。即使它们不是,如果使用链接时间优化,也可以内联。我想这里的'inline'关键字不是解决方案。 – kukyakya
编写汇编语言函数并汇编和链接它比处理编译器特定的内联汇编语句要简单得多。 svc需要一个立即的参数,所以你不能传递一个参数,除非你使用自我修改代码,否则它就是svc立即数。 –