インラインアセンブラでの文字列の引数、返り値


インラインアセンブラでの文字列の引数、返り値の扱いの解説がどこにもなくって、コンパイラが生成するアセンブラから解読して、ようやく動くようになった。ちょっとわかりにくかったので、メモっておく。

渡された char* に書き込む場合

void TestClass::GetVenderSignature(char* vender_sig)
{
    __asm
    {
           mov eax, 0;  ;    /* Vender Signature を取得するindex */
           cpuid;                                 ;             /* CPUID を実行*/
           mov eax, vender_sig
           mov dword ptr [eax], ebx;       ;   /* 最初の4文字*/
           mov dword ptr [eax + 4], edx;   ;   /* 次の4文字*/
           mov dword ptr [eax + 8], ecx;   ;   /* 最後の4文字*/
           mov byte ptr [eax + 12], 0;     ;   /* */  
    }
    return;
}

char*で返す場合

char* TestClass::GetVenderSignature()
{
    __asm
    {
           mov eax, 0;  ;    /* Vender Signature を取得するindex */
           cpuid;                                 ;             /* CPUID を実行*/
           mov eax, vender_sig
           mov dword ptr [eax], ebx;       ;   /* 最初の4文字*/
           mov dword ptr [eax + 4], edx;   ;   /* 次の4文字*/
           mov dword ptr [eax + 8], ecx;   ;   /* 最後の4文字*/
           mov byte ptr [eax + 12], 0;     ;   /* */  
           mov eax, dword ptr vender_sig
    }
    return;
}

[DllImport(“NativeCode.dll”)]
static extern IntPtr GetVenderSignature( );

IntPtr unmanagedBuf = Marshal.AllocHGlobal(32);
GetVenderSignature(unmanagedBuf);
string ansiStr = Marshal.PtrToStringAnsi(unmanagedBuf);
textBoxResult.Text = ansiStr;
Marshal.FreeHGlobal(unmanagedBuf);

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中


%d人のブロガーが「いいね」をつけました。