インラインアセンブラでの文字列の引数、返り値の扱いの解説がどこにもなくって、コンパイラが生成するアセンブラから解読して、ようやく動くようになった。ちょっとわかりにくかったので、メモっておく。
渡された 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);
コメントを残す