【问题标题】:How to access C arrays from assembler for Windows x64?如何从 Windows x64 的汇编程序访问 C 数组?
【发布时间】:2010-03-18 12:46:15
【问题描述】:

我编写了一个汇编函数来加速图像处理的一些事情(图像是用 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!
...

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 您可以通过打印 sizeof(myData) 或在调试器中查看 C++ 端的地址来轻松检查。
    • 非常感谢 - 这确实是对齐问题。 pData 字段从 [rbx + 8] 开始。现在一切正常。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多