Pergunta

Eu escrevi uma função de assembler para acelerar algumas coisas para o processamento de imagens (as imagens são criadas com o CreatedibSection).

Para o Win32, o código do assembler funciona sem problemas, mas para o Win64 eu recebo um acidente assim que tento acessar meus dados da matriz.

Coloquei as informações relevantes em uma estrutura e minha função de assembler recebe um ponteiro para esta estrutura. O ponteiro da estrutura é colocado no EBX/RBX e, com a indexação, leio os dados da estrutura.

Alguma ideia do que estou fazendo de errado? Eu uso o NASM junto com o Visual Studio 2008 e para o Win64 defini "padrão Rel".

Código C ++:

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

CallMyAssemblerFunction(&myData);

Código de montagem:

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

Solução

Provavelmente, o pData o campo está em [rbx + 8], não [rbx + 4]. O compilador insere algum espaço extra ("preenchimento") entre ulParam1 e pData de modo a pData está alinhado em 8 bytes (o que torna os acessos mais rapidamente).

Outras dicas

Dê uma olhada na sua estuncos na memória. Pode ser compensado é diferente em x64

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top