【发布时间】:2014-10-07 07:31:58
【问题描述】:
在 linux 内核中你可以找到如下汇编:
#define DEFINE(sym, val) \
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
当这样使用时
DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS);
生成以下程序集
->NR_PAGEFLAGS $24 __NR_PAGEFLAGS
这显然是有效的程序集。这是做什么的?
这个 asm 如何定义一个变量?请向我指出任何更详细地解释这一点的文档。谢谢!
【问题讨论】:
-
冒号令人困惑,我也很好奇,但我认为如果 sym 和 val 是字符串,那么第一部分会将它们连接起来。在 C 语言中,如果您有两个相邻的字符串文字,它们会被编译器连接起来并被视为一个文字,因此整个第一部分
"\n->" #sym " %0 " #val将归结为一个字符串。虽然这取决于它是如何使用的,而且我通常远离预编译器函数,所以我不知道。 -
为清楚起见添加了生成的程序集。
-
显然它与生成的 Kbuild 头文件有关,而不是与组装本身有关
标签: c linux-kernel inline-assembly