我编写了一个汇编程序函数来加快图像处理的速度(图像是使用 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]
。编译器在 ulParam1
和 pData
之间插入一些额外的空间(“填充”),以便 pData
是 8 字节对齐的(这使得访问速度更快) .
关于c++ - 如何从 Windows x64 的汇编程序访问 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469858/