Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在x86处理器中读取中断标志_C++_C_Assembly_Interrupt_Flags - Fatal编程技术网

C++ 如何在x86处理器中读取中断标志

C++ 如何在x86处理器中读取中断标志,c++,c,assembly,interrupt,flags,C++,C,Assembly,Interrupt,Flags,是否有任何汇编指令允许我们直接读取汇编中处理器标志寄存器中的中断标志 是否可以在C/C++中读取中断标志?根据您所使用的体系结构,使用PUSHF、PUSHFD或PUSHFQ指令 除非你在写内核模块,否则我看不出有什么意义。在用户模式下,它永远不会清晰。我假设您正在编写自己的操作系统或某种嵌入式程序。您不应该读取处理器中断标志,而应该设置中断例程或增加内存中的某个位置,或者将消息推回到某种类型的消息队列,以便中断例程可以触发线程,或者允许某些主级例程检查中断例程是否处理了中断。您需要一点内联汇编。

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

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

根据您所使用的体系结构,使用PUSHF、PUSHFD或PUSHFQ指令


除非你在写内核模块,否则我看不出有什么意义。在用户模式下,它永远不会清晰。

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

您需要一点内联汇编。例如,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。

这不重要,我需要关于两者的说明?您正在编写内核模块吗?@user2485710您所说的“您在哪里指定它”是什么意思?但是检查中断标志不会告诉您这一点。“那不是。”贾瓦德,我想你找错人了。仅仅是中断的事实并不影响程序的逻辑流。中断的某些副作用可能对您的程序可见,例如,用户按了一个键,但当您的程序注意到时,中断早已消失。