Comment accéder aux tableaux C de l’assembleur pour Windows x64?

J’ai écrit une fonction d’assemblage pour accélérer quelques tâches de traitement d’image (les images sont créées avec CreateDIBSection).

Pour Win32, le code de l’assembleur fonctionne sans problème, mais pour Win64, je tombe en panne dès que j’essaie d’accéder aux données de ma baie.

Je mets les informations pertinentes dans une structure et ma fonction d’assembleur obtient un pointeur sur cette structure. Le pointeur struct est placé dans ebx / rbx et avec l’indexation, je lis les données de la structure.

Une idée de ce que je fais mal? J’utilise nasm avec Visual Studio 2008 et pour Win64 j’ai défini “default rel”.

Code C ++:

struct myData { tUInt32 ulParam1; void* pData; }; CallMyAssemblerFunction(&myData); 

Code assembleur:

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! ... 

Très probablement, le champ pData est à [rbx + 8] , pas à [rbx + 4] . Le compilateur insère un espace supplémentaire (“padding”) entre ulParam1 et pData pour que pData soit aligné sur 8 octets (ce qui pData access).

Jetez un coup d’oeil à votre structure en mémoire. Peut être compensé est différent dans x64