Pregunta

He escrito una función de ensamblador para acelerar algunas cosas para el procesamiento de imágenes (imágenes se crean con CreateDIBSection).

En el código ensamblador Win32 funciona sin problemas, pero para Win64 me sale un accidente tan pronto como intento acceder a la matriz de datos.

Pongo la información relevante en una estructura y mi función ensamblador consigue un puntero a esta estructura. El puntero estructura se pone en EBX / RBX y con la indexación que leer los datos de la estructura.

Cualquier idea de lo que estoy haciendo mal? Yo uso nasm junto con Visual Studio 2008 y para Win64 puse "rel por defecto".

código C ++:

struct myData {
  tUInt32 ulParam1;
  void* pData;
};

CallMyAssemblerFunction(&myData);

Código ensamblador:

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!
...
¿Fue útil?

Solución

Muy probablemente, el campo está en pData [rbx + 8], no [rbx + 4]. El compilador inserta un espacio extra ( "relleno") entre ulParam1 y pData modo que pData está alineado de 8 bytes (lo que hace que accede más rápido).

Otros consejos

Tome un vistazo a su estructura en la memoria. Puede ser compensado es diferente en x64

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top