繁体   English   中英

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

[英]How to access C arrays from assembler for Windows x64?

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

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

看看你的记忆中的穿刺。 可能是x64中的偏移量不同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM