2010-07-30 12 views
0

Je rencontre un problème lors de la conversion d'une fonction d'assemblage en ligne en fichier .asm. J'ai besoin d'un code assembleur en ligne séparé, car l'architecture x64 ne prend pas en charge l'assemblage en ligne. Voici le code,Comment convertir un assembleur inline en fichier .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; 
} 

Toute idée comment convertir et lien vers mon fichier cpp? Merci à partir de maintenant.

THK

+2

Pourquoi l'assembleur en ligne est-il dans un bloc try? Assembler ne peut pas à travers des exceptions C++ et vous avez des problèmes plus importants si vous essayez d'attraper des exceptions de processeur non gérées. – doron

+0

Pourquoi ne pas utiliser les fonctions C à la place? http://tldp.org/HOWTO/IO-Port-Programming-2.html – Fr0sT

Répondre

0

probablement votre meilleur pari est de déplacer l'assembleur en ligne figurant dans une fonction distincte dans un fichier séparé source C puis compiler le nouveau fichier source en assembleur (se rappeler que dans votre fichier d'en-tête, vous devrez utiliser). Vous pouvez ensuite prendre la sortie de l'assembleur et la modifier pour 64 bits.

Dans le fichier assembleur généré, vous trouverez des instructions de l'assembleur pour ajouter le symbole à la table de relocalisation. Vous verrez également le code nécessaire pour créer et effacer la pile. Cela différera selon la convention d'appel. Sans plus de détails sur l'assembleur que vous avez l'intention d'utiliser, je ne peux pas fournir plus de détails.

+1

Merci deus-ex-machina399 mais je n'ai pas pu obtenir le résultat attendu :( J'utilise Visual Studio 2008 et j'ai passé ça . code pour séparer cpp et compiler je l'ai écrit extern « C » bool IsInsideVMWare (void) {return true}; pour le fichier d'en-tête, mais il dit: « identifiant introuvable » pour IsInsideVMWare – togikan

0

Je ne pense pas que l'éditeur de liens accepte le code de liaison 32 bits avec le code 64 bits ensemble.

+0

il est correct convertir juste 32bit Je suppose que je vais modifier si j'ai un fichier asm qui représente cette fonction. – togikan