在过去的几天里,我一直在努力解决试图获得 EFLAGS 状态的奇怪行为。为此,我编写了以下代码:
#include <stdio.h>
int flags_state()
{
int flags = 0;
__asm__ __volatile__("pushfq");
__asm__ __volatile__("pop %%rax": "=a"(flags));
return flags;
}
int main()
{
printf("Returning EFLAGS state: 0x%x\n", flags_state());
return 0;
}
当它运行时,我得到:
./flags
Returning EFLAGS state: 0x246
当我两次打印标志时,它变得越来越奇怪
Returning EFLAGS state: 0x246
Returning EFLAGS state: 0x206
当我尝试打印 6 次时它发生了变化
Returning EFLAGS state: 0x246
Returning EFLAGS state: 0x202
Returning EFLAGS state: 0x202
Returning EFLAGS state: 0x202
Returning EFLAGS state: 0x202
Returning EFLAGS state: 0x202
最后是最奇怪的(至少对我而言),我打印了 8 次
Returning EFLAGS state: 0x246
Returning EFLAGS state: 0x206
Returning EFLAGS state: 0x206
Returning EFLAGS state: 0x206
Returning EFLAGS state: 0x206
Returning EFLAGS state: 0x206
Returning EFLAGS state: 0x206
Returning EFLAGS state: 0x206
那么,为什么我第一次得到 0x246 呢?根据英特尔的手册,不应该是 0x2 吗?为什么当我尝试打印更多次并继续更改时它会发生变化?