在GNU中使用C代码中的C头.错误包括内联汇编:’asm’中不可能的
我有一个奇怪的.我正在使用供应商头文件在嵌入式系统上工作.我正在使用GCC 4.6.3编译文件.我想用C代码,我有错误,我无法搞清楚.我正在运行一个供应商示例程序,我所做的就是将main.c文件的名称更改为main.cpp.因此,我假设,C编译器正在解释头文件.其中一个包含以下行:
__attribute__((naked)) static return_type signature { __asm( "svc %0n" "bx r14" : : "I" (number) : "r0" ); } 如果文件的名称是main.c,则文件编译正确,我认为这是因为C编译器正在处理该文件.如果我使用C,我得到的错误是 error: impossible constraint in 'asm' 但同样,我对C编译器没有任何问题.我需要在C文件中调用使用此定义的函数.我已经考虑过编写保留在c端并链接到它们的包装函数,但这将是一个真正的痛苦,而且效率较低.有什么建议? 解决方法svc 也称为swi,是ARM / Thumb软件中断指令.它只需要常量,但它们与其他寄存器常量不同.即,mov r0,#4096.如果要指定立即数,则需要使用预处理程序和标记粘贴.数字不能是变量或寄存器.
#define syscall(number) __attribute__((naked)) static return_type signature { __asm( "svc " #number "n" "bx r14" : : : "r0" ); } 将工作.注意:#是’C’预处理器stringify.另请注意,查看SVC编号是有效的,因为它在I-CACHE中并且检查需要D-CACHE.通常它总是不变的,函数号在寄存器中传递,以便更快地进行系统调用. gcc手册说,
这是典型的数据处理操作数 – 立即,ARM ARM的A5.1.3节. SVC操作数在拇指模式下固定为8位,在ARM模式下固定为24位.可能还有一些我不知道的其他约束,但至少只要数值常量传递给宏,预处理器的字符串化就会起作用. 我想幸运的是,这有点来自gcc而且不幸的是g没有.您可以使用-S并使用这两种工具查看(和发布)输出,从而获得进一步的洞察力. 编辑:您的代码似乎与gcc-4.7.2一起使用,但在我的情况下,number是本地的const int,使用数字可能是个问题.也许它从“C”到“C”有一个微妙的语义变化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |