【问题标题】:How to use inline assembly in C++ to set the Trap flag [duplicate]如何在 C++ 中使用内联汇编来设置陷阱标志 [重复]
【发布时间】:2019-09-04 08:01:53
【问题描述】:

我们如何访问 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

【问题讨论】:

    标签: c++ assembly x86 inline-assembly


    【解决方案1】:

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

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

    此外,甚至不需要破坏EBP:在32位寻址模式下,您可以通过[ESP]直接访问堆栈。

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 1970-01-01
      • 2011-10-15
      • 2013-01-21
      • 2021-06-12
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多