use*_*502 3 c++ windows x86 assembly x86-64
我编写了一个汇编程序函数来加速图像处理的一些事情(使用CreateDIBSection创建图像).
对于Win32,汇编程序代码可以正常工作,但对于Win64,一旦我尝试访问我的数组数据,我就会崩溃.
我将相关信息放在结构中,我的汇编程序函数获取指向此结构的指针.结构指针放在ebx/rbx中,通过索引我从结构中读取数据.
知道我做错了什么吗?我将nasm与Visual Studio 2008一起使用,对于Win64,我设置了"default rel".
C++代码:
struct myData {
tUInt32 ulParam1;
void* pData;
};
CallMyAssemblerFunction(&myData);
Run Code Online (Sandbox Code Playgroud)
汇编代码:
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];
...
Run Code Online (Sandbox Code Playgroud)
Win64平台:
...
mov rbx, rcx; pointer to our struct
mov eax, [rbx]; ulParam1
mov rsi, [rbx + 4]; pData, 8 byte pointer
movd xmm0, [rsi]; CRASH!
...
Run Code Online (Sandbox Code Playgroud)
很可能,这个pData领域[rbx + 8]不是[rbx + 4].编译器在它们之间插入一些额外的空间("填充")ulParam1,pData因此它pData是8字节对齐的(这使访问更快).