2010-03-18 3 views
3

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

Répondre

8

Très probablement, le champ pData est à [rbx + 8], pas [rbx + 4]. Le compilateur insère de l'espace supplémentaire ("padding") entre ulParam1 et pData de sorte que pData soit aligné sur 8 octets (ce qui rend les accès plus rapides).

+0

Vous pouvez facilement vérifier ceci en imprimant sizeof (myData) ou en regardant les adresses du côté C++ dans un débogueur. –

+0

Merci beaucoup - c'était en effet un problème d'alignement. Le champ pData commence à [rbx + 8]. Maintenant tout fonctionne. – user296502

2

Jetez un oeil à votre struncture en mémoire. Peut être décalé est différent dans x64

Questions connexes