"asm volatile("pushfl; 是什么意思? popl %0" : "=r" (eflags))" 是什么意思?在 c 组装?

What does "asm volatile("pushfl; popl %0" : "=r" (eflags))" mean? in assembly at c?

现在我尝试理解 xv6 代码。我找到了下面的代码。

我认为这段代码与汇编有关,但我找不到它的意思。

特别是,我发现 asm volatile(:) 的前面部分表示程序集操作集和 eflags 是什么,但是我找不到 this("=r" (eflags)) 的后面是什么意思。

所以我的问题是..下面的代码是什么意思? 如果您能给我一些答案或建议,我将非常感谢您的分享。 谢谢:)

static inline uint readeflags(void)
{
  uint eflags;
  asm volatile("pushfl; popl %0" : "=r" (eflags));
  return eflags;
}

为了回答你的最后一个问题,"=r" (eflags) 部分是在 GCC 内联汇编中指定的方式以何种方式 (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html)。位置从0开始编号,可以指定多个位置。 %0 因此是第一个。

pushflEFLAGS 寄存器的内容压入堆栈,pop %0 删除最顶层的值,即 EFLAGS 值并将其放置在位置 %0,这将是 eflags 变量。这样做是因为IA-32指令集中没有直接读取EFLAGS的指令。


1: 也被 LLVM 使用,但不是 MSVC – 内联汇编不标准化!