"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
因此是第一个。
pushfl
将 EFLAGS
寄存器的内容压入堆栈,pop %0
删除最顶层的值,即 EFLAGS
值并将其放置在位置 %0
,这将是 eflags
变量。这样做是因为IA-32指令集中没有直接读取EFLAGS
的指令。
1: 也被 LLVM 使用,但不是 MSVC – 内联汇编不标准化!
现在我尝试理解 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
因此是第一个。
pushfl
将 EFLAGS
寄存器的内容压入堆栈,pop %0
删除最顶层的值,即 EFLAGS
值并将其放置在位置 %0
,这将是 eflags
变量。这样做是因为IA-32指令集中没有直接读取EFLAGS
的指令。
1: 也被 LLVM 使用,但不是 MSVC – 内联汇编不标准化!