多次调用 C 预处理器宏(通过变量)

Gui*_*i13 2 c macros assembly

我想清理我的汇编代码并提供一种通过宏多次调用“NOP”的方法:

#define NOP() asm(" nop")

#define NOP_N( N ) \
    NOP(); \
    NOP(); \
    .... call NOP() N times
Run Code Online (Sandbox Code Playgroud)

我无法确定这在宏中是否可行。

显然,出于性能原因,我不想要这样的东西:

#define NOP_N( n ) { register int i; for(i=0;i<n;i++) asm(" nop"); }
Run Code Online (Sandbox Code Playgroud)

这违背了 NOP 的目的:

L17:                                    ; NOP_N(3);
        nop
        addi      1,r0                  ; Unsigned
        cmpi      3,r0
        blo       L17
Run Code Online (Sandbox Code Playgroud)

代码是C和汇编语言,所以这里不能涉及C++。此外,编译器相当陈旧,不支持可变参数宏......

krl*_*mlr 5

我认为无界的解决方案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");)
Run Code Online (Sandbox Code Playgroud)

第一部分可以轻松自动生成。第二部分采用的技术有时称为标记粘贴