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
的组合(它是 0
和 3
之间的整数文字)以获得像 ASM_ARGS_0
这样的表达式,ASM_ARGS_1
等等,这本身就是一个宏。事实上,ASM_ARGS_0
可能会被什么都取代,而ASM_ARGS_3会被
取代, "r" (_a1), "r" (_a2), "r" (_a3)
。
在阅读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
的组合(它是 0
和 3
之间的整数文字)以获得像 ASM_ARGS_0
这样的表达式,ASM_ARGS_1
等等,这本身就是一个宏。事实上,ASM_ARGS_0
可能会被什么都取代,而ASM_ARGS_3会被
取代, "r" (_a1), "r" (_a2), "r" (_a3)
。