ASM_ARGS_##nr 是什么意思?

What does ASM_ARGS_##nr mean?

在阅读Linux的softirq时,发现了如下代码:

    asm volatile ("swi  0x0 @ syscall " #name   \
             : "=r" (_a1)               \
             : "r" (_nr) ASM_ARGS_##nr          \
             : "memory");               \
       _a1; })

我知道“r” (_nr)是输入列表,但是ASM_ARGS_##nr是什么意思?

运算符 ## 用于连接 preprocessor macro 中的标识符,如行继续字符 \ASM_ARGS_nr 或两者都是该宏的参数。

整个宏可能看起来类似于这个片段(我在 another question 中找到的):

#define ASM_ARGS_1      ASM_ARGS_0, "r" (_a1)
#define ASM_ARGS_2      ASM_ARGS_1, "r" (_a2)
#define ASM_ARGS_3      ASM_ARGS_2, "r" (_a3)
#define LOADREGS_5(a1, a2, a3, a4, a5)          \
register int _v1 asm ("v1") = (int) (a5);     \
LOADREGS_4 (a1, a2, a3, a4)

#define LOADREGS_6(a1, a2, a3, a4, a5, a6)      \

register int _v2 asm ("v2") = (int) (a6);     \

LOADREGS_5 (a1, a2, a3, a4, a5)

#define MYLIBC_SYSCALL(name, nargs, args...)               \
({                                                        \

    unsigned int retval;                              \

    {                                                 \

    register int _a1 asm ("r0"), _nargs asm ("r7");   \
    LOADREGS_##nargs(args)                            \
    _nargs = __NR_##name;                             \
    asm volatile (                                    \
            "swi    0x0"                              \
            :"=r"(_a1)                                \
            :"r"(_nargs) ASM_ARGS_##nargs             \
            : "memory" );                             \

但是这个片段将有助于理解您关于 ## 的问题。这里 ASM_ARGS_##nargs 导致参数 nargs 的组合(它是 03 之间的整数文字)以获得像 ASM_ARGS_0 这样的表达式,ASM_ARGS_1等等,这本身就是一个宏。事实上,ASM_ARGS_0可能会被什么都取代,而ASM_ARGS_3会被
取代, "r" (_a1), "r" (_a2), "r" (_a3)