使用GCC

时间:2016-01-12 02:13:07

标签: c gcc inline-assembly

我正在编写一个代码,用于检查程序是否在C中的VM或VPC下运行,并且我在编译时在内联ASM中有一些错误。 到目前为止,这是我的代码:

bool IsInsideVPC()
{
  bool rc = false;

  try
  {
    __asm__(
        "push %ebx\n\t"
        "movl  $0, %ebx\n\t" // Flag
        "movl  $1, %eax"); // VPC function number

                         // call VPC
        asm __volatile__ (".byte 0x0F");
        asm __volatile__ (".byte 0x3F");
        asm __volatile__ (".byte 0x07");
        asm __volatile__ (".byte 0x0B");

        __asm__(
            "test %ebx, %ebx\n\t"
            "movl $1, $rc\n\t" // Flag
            "pop %ebx");

  }

  catch (...)
  {
    // The except block shouldn't get triggered if VPC is running!!
  }

  return rc;
}

bool IsInsideVMWare()
{
  bool rc = false;

  try
  {
    __asm__(
        "push   %edx\n\t"
        "push   %ecx\n\t" // Flag
        "push   %ebx\n\t"
        "movl   'VMXh', %eax\n\t"
        "movl   $0, %ebx\n\t"
        "movl   $10, %ecx\n\t"
        "movl   'VX', %edx\n\t"
        "in     %eax, %dx\n\t"
        "cmp    %ebx, 'VMXh'\n\t"
        "movl   $1, $rc\n\t"
        "pop    %ebx\n\t"
        "pop    %ecx\n\t"
        "pop    %edx");
  }
  catch (...)
  {
    rc = false;
  }

  return rc;
}

在所有这些之后,有一个主要功能运行eveything,检查结果并输出答案。 我没有编写原始代码,但我确实将其更改为GCC语法。

我遇到的错误我认为与将字符串插入寄存器的方式有关。

0 个答案:

没有答案