Windowsのx64のためにアセンブラからCアレイにアクセスするには?
質問
私は(画像は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バイトであるので、コンパイラはpData
とpData
の間にいくつかの余分なスペース(「パディング」)を挿入します。
他のヒント
メモリーにあなたの構造を見てみましょう。オフセットすることができるのx64で異なっている。
所属していません StackOverflow