【问题标题】:Inline assembly in C++ fail?C ++中的内联汇编失败?
【发布时间】:2015-02-19 00:30:45
【问题描述】:

好吧,基本上我写了一个汇编函数来检测运行时是否存在某个进程。我并没有完全理解内联汇编,即使我用 asm 包装器包装了汇编代码,它仍然会将内部代码检测为 C 代码......基本上它有点像这样:

__inline bool isProcLoaded()
{
    _asm
    {
        mov ah, 0x48
        int     0x68 ; After compiling it breaks on this line, the 'int' is highlighted
        cmp ax ...
    }
}

这里有什么问题,我该如何解决?

【问题讨论】:

  • 不太清楚你的问题是什么?不会编译?或者它给出了运行时错误? (编辑器将 int 误解为 c 关键字的语法高亮问题似乎不会导致任何实际问题)

标签: c++ visual-studio visual-c++ assembly inline-assembly


【解决方案1】:

这可能是因为int 是一条中断指令,现在在用户模式下很少使用,因为大多数中断都是特权(related)。

如果没有更多细节,我不知道你想在这里实现什么,尽管在开始搜索后看起来类似于检测 SoftICE 调试器的方法,并且该代码非常古老(DOS 和早期 Windows 时代)所以看起来只有在现代操作系统上你会得到一个0xC0000005 STATUS_ACCESS_VIOLATION 异常是合理的。

【讨论】:

  • 即便如此,它不应该直接跳过中断,因为它不直接调用0x80吗?无论如何,我怎样才能使它以另一种方式恢复它并仍然继续处理我的其余代码?在这种情况下,luhn 序列会起作用吗?
  • OP - 我认为你不明白 int 的作用。它做了两件事。它将处理器状态更改为特权状态并跳转到软件中断向量。执行不再受当前进程的控制。现在由操作系统决定如何从这里开始。
  • 所以无论我将 int 从那里指向何处,操作系统都会决定下一步该做什么?这是有道理的。
  • 稍微更新了答案。
  • int 指令对某些事情非常有用——甚至在用户空间中 (!)。那是因为您可以用它“注入”陷阱,并通过这种方式与调试器进行交互。这不是一件常见的事情,同意,但这不是内联汇编器不支持它的理由。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 2013-07-23
  • 2017-11-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多