1

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

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>}
4

1 回答 1

3

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

关于您需要扩展一些常量这一事实,也许您最好的选择是使用预处理器字符串化、内联 ASM 和复合语句表达式的组合。类似于以下内容,其中所有参数都是常量:

#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);
}
于 2013-08-23T12:56:12.883 回答