3

我编写了一个汇编函数来加速图像处理的一些事情(图像是用 CreateDIBSection 创建的)。

对于 Win32,汇编代码可以正常工作,但对于 Win64,我一尝试访问我的数组数据就会崩溃。

我把相关信息放在一个结构中,我的汇编函数得到一个指向这个结构的指针。将结构指针放入 ebx/rbx 并通过索引从结构中读取数据。

知道我做错了什么吗?我将 nasm 与 Visual Studio 2008 一起使用,对于 Win64,我设置了“默认 rel”。

C++ 代码:

struct myData {
  tUInt32 ulParam1;
  void* pData;
};

CallMyAssemblerFunction(&myData);

汇编代码:

赢32:

...
  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]。编译器在 和 之间插入一些额外的空间(“填充”)ulParam1pData以便pData8 字节对齐(这使得访问更快)。

于 2010-03-18T12:59:56.343 回答
2

看看你的记忆结构。x64 中的偏移量可能不同

于 2010-03-18T12:51:30.290 回答