画像処理を高速化するアセンブラ関数を作成しました (画像は CreateDIBSection で作成されます)。
Win32 の場合、アセンブラ コードは問題なく動作しますが、Win64 の場合、配列データにアクセスしようとするとすぐにクラッシュします。
関連情報を構造体に入れると、アセンブラー関数はこの構造体へのポインターを取得します。構造体ポインターは ebx/rbx に配置され、インデックスを使用して構造体からデータを読み取ります。
私が間違っていることは何ですか?私は Visual Studio 2008 と一緒に nasm を使用しており、Win64 では「デフォルト rel」を設定しています。
C++ コード:
struct myData {
tUInt32 ulParam1;
void* pData;
};
CallMyAssemblerFunction(&myData);
アセンブラー コード:
Win32:
...
push ebp;
mov ebp,esp
mov ebx, [ebp + 8]; pointer to our struct
mov eax, [ebx]; ulParam1
mov esi, [ebx + 4]; pData, 4 byte pointer
movd xmm0, [esi];
...
Win64:
...
mov rbx, rcx; pointer to our struct
mov eax, [rbx]; ulParam1
mov rsi, [rbx + 4]; pData, 8 byte pointer
movd xmm0, [rsi]; CRASH!
...