如何在内联汇编中使用整数参数?我有以下功能参数:
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>}
答案 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);
}