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

标签 c assembly macros

我想清理我的汇编代码并提供一种通过宏多次调用“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/

相关文章:

excel - 条件格式单元格的颜色索引

c - #define 使用结构化指针中的成员

c - Memcached ruby​​gem + Rlibmemcached 参数错误与 memcache_mget()

转换为函数

c++ - 哪些C/C++编译器可以使用推式弹出指令创建局部变量,而不仅仅是增加esp一次?

emacs - 如何在 Elisp 中创建 DSL

C中的计算没有遵循

c - 为什么这段代码中的 `bar`没有静态存储持续时间?

使用 C 和汇编程序计算整数的符号

c - STM32F405 的引导加载程序未跳转至应用程序