Como acessar as matrizes C do Assembler para Windows X64?
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!
...
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