加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在GNU中使用C代码中的C头.错误包括内联汇编:’asm’中不可能的

发布时间:2020-12-16 07:04:02 所属栏目:百科 来源:网络整理
导读:我有一个奇怪的.我正在使用供应商头文件在嵌入式系统上工作.我正在使用GCC 4.6.3编译文件.我想用C代码,我有错误,我无法搞清楚.我正在运行一个供应商示例程序,我所做的就是将main.c文件的名称更改为main.cpp.因此,我假设,C编译器正在解释头文件.其中一个包含
我有一个奇怪的.我正在使用供应商头文件在嵌入式系统上工作.我正在使用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手册说,

‘I’– Integer that is valid as an immediate operand in a data
processing instruction. That is,an integer in the range 0
to 255 rotated by a multiple of 2

这是典型的数据处理操作数 – 立即,ARM ARM的A5.1.3节. SVC操作数在拇指模式下固定为8位,在ARM模式下固定为24位.可能还有一些我不知道的其他约束,但至少只要数值常量传递给宏,预处理器的字符串化就会起作用.

我想幸运的是,这有点来自gcc而且不幸的是g没有.您可以使用-S并使用这两种工具查看(和发布)输出,从而获得进一步的洞察力.

编辑:您的代码似乎与gcc-4.7.2一起使用,但在我的情况下,number是本地的const int,使用数字可能是个问题.也许它从“C”到“C”有一个微妙的语义变化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读