如何从汇编程序访问Windows x64的C数组?

时间:2010-03-18 12:46:15

标签: c++ windows assembly x86 x86-64

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

对于Win32,汇编程序代码可以正常运行,但是对于Win64,一旦我尝试访问我的数组数据,就会崩溃。

我将相关信息放在结构中,我的汇编程序函数获取指向此结构的指针。结构指针放在ebx / rbx中,通过索引我从结构中读取数据。

知道我做错了什么吗?我将nasm与Visual Studio 2008一起使用,对于Win64,我设置了“default 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!
...

2 个答案:

答案 0 :(得分:8)

很可能pData字段位于[rbx + 8],而不是[rbx + 4]。编译器在ulParam1pData之间插入一些额外的空格(“填充”),以便pData以8字节对齐(这使访问更快)。

答案 1 :(得分:2)

看看你的内存结构。可能在x64中偏移量不同