2010-07-30 7 views
0

У меня возникла проблема с преобразованием встроенной ассемблерной функции в файл .asm. Мне нужен отдельный встроенный ассемблерный код, потому что в архитектуре x64 нет поддержки встроенной сборки. Вот код,Как преобразовать встроенный ассемблер в файл .asm

#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

Почему встроенный ассемблер в блоке try? Ассемблер не может проходить через исключения C++, и у вас возникают большие проблемы, если вы пытаетесь поймать необработанные исключения процессора. – doron

+0

Почему вы не можете использовать функции C вместо этого? http://tldp.org/HOWTO/IO-Port-Programming-2.html – Fr0sT

ответ

0

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

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

+1

Спасибо deus-ex-machina399, но я не смог получить ожидаемый результат :( Я использую Visual Studio 2008, и я передал это . код для разделения файла CPP и скомпилировать его я написал ехЬегп «C» BOOL IsInsideVMWare (недействительными) {возвращает истину}; и заголовочный файл, но он говорит, что «идентификатор не найден» для IsInsideVMWare – togikan

0

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

+0

это нормально преобразование только 32bit Я думаю, я изменю, если у меня есть asm-файл, который представляет эту функцию. – togikan

Смежные вопросы