如何理解 Visual C++ 中的 _asm 命令

Posted

技术标签:

【中文标题】如何理解 Visual C++ 中的 _asm 命令【英文标题】:How to understand an _asm command in Visual C++ 【发布时间】:2019-11-18 21:09:48 【问题描述】:

我在MS Visual Studio中捡别人的C++代码,遇到了这样一行:

 if (l > n) _asmint 3;

我知道这是为了破坏调试器。我也明白它已被弃用并被替换为:

__debugbreak()

我的问题是......这是如何工作的?为什么要在调试器中产生这样的内联汇编命令?

【问题讨论】:

Read the section on INT3 对于以后的帖子,最好在发布与汇编语言相关的问题时包含目标操作系统/硬件。 【参考方案1】:

这与使用 IDE 设置断点相同,但不同之处在于,使用 IDE 或任何其他调试器,它会设置一个断点,用int 3__asm int 3 覆盖所选的操作码,它设置为一个新的操作码行。

【讨论】:

【参考方案2】:

添加到注释中,int 3 是触发硬件中断的汇编指令,这会导致正在运行的线程(您的代码)在操作系统服务中断时停止。不确定具体细节,但调试器必须能够挂接到操作系统以获取该中断的通知,并采取适当的行动。

阅读更多:https://blogs.msdn.microsoft.com/kangsu/2005/09/07/no-more-int-3/

【讨论】:

以上是关于如何理解 Visual C++ 中的 _asm 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何将 x86 和 x64 asm 文件包含到单个 Visual Studio 项目中?

使用 Visual C++ 环境和“Asm”关键字作为 Assembler IDE 的替代方案?

如何检测 Visual C++ 中的 rdtscp 支持?

Visual Studio 2008 内联汇编 关键字__asm出错

运行时 Visual C++ 10 中的奇怪异常

如何从 C 中引用在 Visual Studio 的 .asm 文件中定义的全局变量