如何在 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
。你应该
- 在第二条流水线上做32位
MOV
以避免丢失ESP
, 的高位
- 使用 32 位寄存器访问您推送的值。
此外,甚至不需要破坏 EBP
:在 32 位寻址模式下,您可以通过 [ESP]
.
直接访问堆栈
考虑到所有这些因素后,您的函数将如下所示。
void trap()
{
__asm PUSHF ;
__asm AND WORD PTR[ESP], 0FEFFH;
__asm POPF;
}
不过,这段代码似乎没有多大意义:执行pushf
后你会得到另一个陷阱,and
指令可能永远不会执行。
我们如何在 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
。你应该
- 在第二条流水线上做32位
MOV
以避免丢失ESP
, 的高位
- 使用 32 位寄存器访问您推送的值。
此外,甚至不需要破坏 EBP
:在 32 位寻址模式下,您可以通过 [ESP]
.
考虑到所有这些因素后,您的函数将如下所示。
void trap()
{
__asm PUSHF ;
__asm AND WORD PTR[ESP], 0FEFFH;
__asm POPF;
}
不过,这段代码似乎没有多大意义:执行pushf
后你会得到另一个陷阱,and
指令可能永远不会执行。