如何将内联汇编程序转换为.asm文件

时间:2010-07-30 12:04:12

标签: c++ assembly 64-bit inline-assembly

我在将内联汇编程序函数转换为.asm文件时遇到问题。我需要单独的内联汇编代码,因为在x64架构中不支持内联汇编。 这是代码,

#include <windows.h>
#include <string>
#include <iostream>
#include <tlhelp32.h>

using namespace std;


    int filter(int code)
    {
        if (code == EXCEPTION_PRIV_INSTRUCTION)
        {
            return EXCEPTION_EXECUTE_HANDLER;
        }
        else
        {
            return EXCEPTION_CONTINUE_SEARCH;
        }
    }

    bool IsInsideVMWare(void)
    {
      bool rc = true;

      __try
      {
        __asm
        {
          push   edx
          push   ecx
          push   ebx

          mov    eax, 'VMXh'
          mov    ebx, 0 // any value but not the MAGIC VALUE
          mov    ecx, 10 // get VMWare version
          mov    edx, 'VX' // port number

          in     eax, dx // read port
                         // on return EAX returns the VERSION
          cmp    ebx, 'VMXh' // is it a reply from VMWare?
          setz   [rc] // set return value

          pop    ebx
          pop    ecx
          pop    edx
        }
      }
      __except(GetExceptionCode())
      {
        rc = false;
      }

      return rc;
    }

int main()
{
    if(IsInsideVMWare())
        cout << "You are in a VMware.." << endl;
    else
        cout << "You are in a native system.."<< endl;
    system("PAUSE");
    return 0;
}

知道如何转换和链接到我的cpp文件? 谢谢你们。

T H K

2 个答案:

答案 0 :(得分:0)

可能你最好的办法是将内联汇编程序列入单独的C源文件中的单独函数,然后将新的源文件编译成汇编程序(记住在头文件中你需要使用extern "C" { ... } )。然后,您可以获取汇编器输出并将其修改为64位。

在生成的汇编程序文件中,您会发现有用于将符号添加到重定位表的汇编程序指令。您还将看到创建和清除堆栈所需的代码。这将根据调用约定而有所不同。如果没有关于您打算使用的汇编程序的更多详细信息,我无法提供更多详细信息。

答案 1 :(得分:0)

我认为链接器不会接受将32位代码与64位代码链接在一起。