【问题标题】:How does this inline assembly define a variable?这个内联汇编是如何定义一个变量的?
【发布时间】: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


【解决方案1】:

这不是有效的程序集。它使用 sed 脚本转换成类似的东西:

#define NR_PAGEFLAGS 24

该文件随后被许多汇编源文件包含,这允许在汇编程序文件中使用 C 常量表达式的结果。

【讨论】:

  • 能否请您指出转换它的 sed 脚本?谢谢!
  • 它在Kbuild的顶层内核源码目录中。
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2010-11-19
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多