如何在 C++ 中使用内联汇编来设置 Trap 标志

How to use inline assembly in C++ to set the Trap flag

我们如何在 x86 架构中访问陷阱标志并在 32 位程序中更改其值?

我试过在Visual Studio中使用内联汇编:

     #include <iostream>
      void trap() 
       {
          __asm PUSHF ;
          __asm MOV BP, SP;
          __asm AND WORD PTR[BP + 0], 0FEFFH;
          __asm POPF;
       }

并出现以下错误:

error C2432:  illegal reference to 16-bit data in 'first operand'
error C2415:  improper operand type

您正在制作一个 32 位程序。为什么要尝试使用 16 位地址?您的堆栈指针很可能大于 0xffff。你应该

  1. 在第二条流水线上做32位MOV以避免丢失ESP,
  2. 的高位
  3. 使用 32 位寄存器访问您推送的值。

此外,甚至不需要破坏 EBP:在 32 位寻址模式下,您可以通过 [ESP].

直接访问堆栈

考虑到所有这些因素后,您的函数将如下所示。

void trap() 
{
    __asm PUSHF ;
    __asm AND WORD PTR[ESP], 0FEFFH;
    __asm POPF;
}

不过,这段代码似乎没有多大意义:执行pushf后你会得到另一个陷阱,and指令可能永远不会执行。