如何读取x86处理器中的中断标志

时间:2014-02-24 21:32:56

标签: c++ c assembly interrupt flags

是否有任何汇编指令让我们直接读取汇编处理器Flags寄存器中的中断标志?

是否可以读取C / C ++中的中断标志?

3 个答案:

答案 0 :(得分:1)

根据Wikipedia,您根据您所使用的架构使用PUSHF,PUSHFD或PUSHFQ指令。

除非您正在编写内核模块,否则我不明白这一点。在用户模式下永远不会清楚。

答案 1 :(得分:1)

您需要一些内联汇编。例如,Linux在'irqflags.h'中执行此操作。此功能适用于32位和64位IA。

static inline unsigned long native_save_fl(void)
{
    unsigned long flags;

     /*
      * "=rm" is safe here, because "pop" adjusts the stack before
      * it evaluates its effective address -- this is part of the
      * documented behavior of the "pop" instruction.
      */
     asm volatile("# __raw_save_flags\n\t"
              "pushf ; pop %0"
              : "=rm" (flags)
              : /* no input */
              : "memory");

     return flags;
}

返回所有处理器EFLAGS位,包括第9位的中断使能(EFLAGS.IF)。如果您只想检查IF,则将返回值屏蔽为0x200。

答案 2 :(得分:0)

我假设您正在编写自己的操作系统或某种类型的嵌入式程序。您应该设置或增加内存中的某个位置,或者将消息回送到某种类型的消息队列,以便中断例程可以触发线程或允许某个主级例程检查,而不是读取处理器中断标志。如果中断例程处理了一个中断。