我编写了一个汇编程序函数来加速图像处理的一些事情(使用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!
...
答案 0 :(得分:8)
很可能pData
字段位于[rbx + 8]
,而不是[rbx + 4]
。编译器在ulParam1
和pData
之间插入一些额外的空格(“填充”),以便pData
以8字节对齐(这使访问更快)。
答案 1 :(得分:2)
看看你的内存结构。可能在x64中偏移量不同