質問

私は(画像は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!
...
役に立ちましたか?

解決

かなりおそらく、pDataフィールドは[rbx + 8]で、[rbx + 4]ではありません。そのulParam1が(速くアクセスします)整列8バイトであるので、コンパイラはpDatapDataの間にいくつかの余分なスペース(「パディング」)を挿入します。

他のヒント

メモリーにあなたの構造を見てみましょう。オフセットすることができるのx64で異なっている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top