我想清理我的汇编代码并提供一种通过宏多次调用“NOP”的方法:
#define NOP() asm(" nop")
#define NOP_N( N ) \
NOP(); \
NOP(); \
.... call NOP() N times
我无法确定这在宏中是否可行。
显然,出于性能原因,我不想要这样的东西:
#define NOP_N( n ) { register int i; for(i=0;i<n;i++) asm(" nop"); }
这违背了 NOP 的目的:
L17: ; NOP_N(3);
nop
addi 1,r0 ; Unsigned
cmpi 3,r0
blo L17
代码是C和汇编语言,所以这里不能涉及C++。此外,编译器相当陈旧,不支持可变参数宏......
最佳答案
我不认为无界的解决方案 N
是可能的。对于有界 N
你可以按照以下方式做一些事情:
#define REPEAT_0(WHAT)
#define REPEAT_1(WHAT) WHAT REPEAT_0(WHAT)
#define REPEAT_2(WHAT) WHAT REPEAT_1(WHAT)
#define REPEAT_3(WHAT) WHAT REPEAT_2(WHAT)
#define NOP_N(N) REPEAT_##N(asm("nop");)
第一部分可以轻松自动生成。第二部分采用的技术有时称为 token pasting .
关于多次调用 C 预处理器宏(通过变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16605043/