3

画像処理を高速化するアセンブラ関数を作成しました (画像は 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!
...
4

2 に答える 2

8

おそらく、pDataフィールドは[rbx + 8]ではなく[rbx + 4]です。ulParam1コンパイラは、 との間に余分なスペース (「パディング」) を挿入pDataして、pData8 バイトにアラインされます (アクセスが高速になります)。

于 2010-03-18T12:59:56.343 に答える
2

記憶の中のあなたの構造を見てください。x64ではオフセットが異なる場合があります

于 2010-03-18T12:51:30.290 に答える