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

标签 c++ windows assembly x86 x86-64

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

对于 Win32,汇编程序代码可以正常工作,但对于 Win64,我在尝试访问我的数组数据时立即崩溃。

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

知道我做错了什么吗?我将 nasm 与 Visual Studio 2008 一起使用,对于 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]。编译器在 ulParam1pData 之间插入一些额外的空间(“填充”),以便 pData 是 8 字节对齐的(这使得访问速度更快) .

关于c++ - 如何从 Windows x64 的汇编程序访问 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469858/

相关文章:

gcc - 为什么 gcc 在 main 的开头推送 %rbx?

c - 显示 HBITMAP

windows - Git (Windows) - 无法在克隆时创建文件。作为 super 用户工作

windows - 如何在已修改为不运行资源管理器的 Windows 系统上启动时运行应用程序

c++ - 获取 64 位整数乘法的高位部分

C++字符串混淆

C++ 试图创建一个二维点(数组)队列

C++ "namespace scope"

c++ - 重新分配给映射变量时是否自动使用移动?

linux - 获取错误 : bad register name `%bpl'