J'ai écrit une fonction d'assembleur pour accélérer certaines opérations de traitement d'image (les images sont créées avec CreateDIBSection).Comment accéder aux tableaux C de l'assembleur pour Windows x64?
Pour Win32 le code assembleur fonctionne sans problèmes, mais pour Win64 je reçois un plantage dès que j'essaie d'accéder à mes données de tableau.
Je mets les informations pertinentes dans une structure et ma fonction d'assembleur obtient un pointeur vers cette structure. Le pointeur struct est mis en 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 je définis "default rel".
C++ Code:
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!
...
Vous pouvez facilement vérifier ceci en imprimant sizeof (myData) ou en regardant les adresses du côté C++ dans un débogueur. –
Merci beaucoup - c'était en effet un problème d'alignement. Le champ pData commence à [rbx + 8]. Maintenant tout fonctionne. – user296502