0

インライン アセンブラ関数を .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

4

2 に答える 2

0

おそらく最善の策は、リストされているインライン アセンブラを別の C ソース ファイル内の別の関数に移動し、新しいソース ファイルをアセンブラにコンパイルすることです (ヘッダー ファイルで を使用する必要があることに注意してくださいextern "C" { ... })。次に、アセンブラー出力を取得して、64 ビット用に変更できます。

生成されたアセンブラー ファイルには、シンボルを再配置テーブルに追加するためのアセンブラー ディレクティブがあることがわかります。スタックの作成とクリアに必要なコードも表示されます。これは、呼び出し規約によって異なります。使用する予定のアセンブラに関する詳細がなければ、これ以上の詳細を提供することはできません。

于 2010-07-30T12:18:29.460 に答える
0

リンカーが 32 ビット コードと 64 ビット コードのリンクを受け入れるとは思えません。

于 2010-07-30T13:15:48.340 に答える