字符串化内联汇编

时间:2013-08-23 07:22:15

标签: gcc arm

如何在内联汇编中使用整数参数?我有以下功能参数:

unsigned int __MRC(uint32 coproc, uint32 opcode1, uint32 CRn, uint32 CRm, uint32 opcode2)

我已将CRn CRm移至r0和r1

register unsigned int r0 asm("r0") = (unsigned int) (CRn);

register unsigned int r1 asm("r1") = (unsigned int) (CRm);

我现在想以表格形式写出来:

__asm__(" MRC ... ");

这是格式:

MRC <copr>, <op1>, Rd, CRn, CRm{, <op2>}

1 个答案:

答案 0 :(得分:3)

如果我理解你的问题,我认为答案是使用GCC Extended ASM功能。您可以避免使用register unsigned int ... asm("r*") ...代码行,只需使用扩展的ASM语法编写内联汇编语句。

关于你需要扩展一些常量的事实,也许最好的办法是使用预处理器字符串化,内联ASM和compound statement expressions的组合。 类似于以下内容,其中所有参数都是常量:

#define MRC(coproc, opcode1, CRn, CRm, opcode2)\
  ({unsigned int rd; __asm__(\
    "MRC p" #coproc ", " #opcode1 ", %0, c" #CRn ", c" #CRm ", " #opcode2 \
    :"=r"(rd)); rd; })

unsigned int foo(void) {
  // expands to something like:
  // MRC p15, 0, r0, c0, c0, 0
  return MRC(15, 0, 0, 0, 0);
}