Как преобразовать встроенный ассемблер в файл .asm - PullRequest
0 голосов
/ 30 июля 2010

У меня проблема с преобразованием встроенной функции ассемблера в файл .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?Спасибо теперь.

THK

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

Я не думаю, что компоновщик примет соединение 32-битного кода с 64-битным кодом вместе.

0 голосов
/ 30 июля 2010

Вероятно, вам лучше всего переместить перечисленный встроенный ассемблер в отдельную функцию в отдельный исходный файл C, а затем скомпилировать новый исходный файл в ассемблер (помня, что в заголовочном файле вам нужно будет использовать extern "C" { ... }). Затем вы можете взять вывод на ассемблере и изменить его на 64-битный.

В сгенерированном файле ассемблера вы найдете, что есть директивы ассемблера для добавления символа в таблицу перемещений. Вы также увидите код, необходимый для создания и очистки стека. Это будет отличаться в зависимости от соглашения о вызовах. Без более подробной информации об ассемблере, который вы намереваетесь использовать, я не могу предоставить более подробную информацию.

...