I ont la partie suivante dans mon asm code assembleur(montage en ligne dans C) d'erreur de segmentation de mémoire amusant
"LOOP%=:\n\t"
"movapd (%%eax), %%xmm4\n\t"
"addl $32, %%eax\n\t"
"movsd (%%edx), %%xmm5\n\t"
"addl $16, %%edx\n\t"
"movapd %%xmm4, %%xmm6\n\t"
"subl $1, %%ecx\n\t"
"unpcklpd %%xmm5, %%xmm5\n\t"
"testl %%ecx, %%ecx\n\t"
"mulpd %%xmm5, %%xmm6\n\t"
"movsd -8(%%edx), %%xmm7\n\t"
"addpd %%xmm6, %%xmm0\n\t"
"movapd -16(%%eax), %%xmm6\n\t"
"unpcklpd %%xmm7, %%xmm7\n\t"
"mulpd %%xmm6, %%xmm5\n\t"
"addpd %%xmm5, %%xmm1\n\t"
"mulpd %%xmm7, %%xmm4\n\t"
"addpd %%xmm4, %%xmm2\n\t"
"mulpd %%xmm6, %%xmm7\n\t"
"addpd %%xmm7, %%xmm3\n\t"
"jne LOOP%=\n\t" */
Ce code contient en% ecx un "indice de boucle", tout en balayant deux (double *) les tableaux A et B effectuant un certain calcul en utilisant SSE2. Les deux tableaux ont été alignés sur 64Bytes (alignés sur la ligne de cache de sorte que l'exigence d'alignement de 16 octets de SSE est satisfaite). % eax contient un "pointeur" vers le tableau A et "edx" contient un "pointeur" vers le tableau B. Il fonctionne correctement et il n'y a pas d'erreur de lecture de la mémoire. Je me demande pourquoi dois-je faire
"movapd (%%eax), %%xmm4\n\t"
"addl $32, %%eax\n\t"
"movsd (%%edx), %%xmm5\n\t"
"addl $16, %%edx\n\t"
......
"movsd -8(%%edx), %%xmm7\n\t"
......
"movapd -16(%%eax), %%xmm6\n\t"
......
Je changer la version initiale à
"LOOP%=:\n\t"
"movapd (%%eax), %%xmm4\n\t"
"movsd (%%edx), %%xmm5\n\t"
"movapd %%xmm4, %%xmm6\n\t"
"subl $1, %%ecx\n\t"
"unpcklpd %%xmm5, %%xmm5\n\t"
"testl %%ecx, %%ecx\n\t"
"mulpd %%xmm5, %%xmm6\n\t"
"movsd 8(%%edx), %%xmm7\n\t"
"addl $16, %%edx\n\t"
"addpd %%xmm6, %%xmm0\n\t"
"movapd 16(%%eax), %%xmm6\n\t"
"addl $32, %%eax\n\t"
"unpcklpd %%xmm7, %%xmm7\n\t"
"mulpd %%xmm6, %%xmm5\n\t"
"addpd %%xmm5, %%xmm1\n\t"
"mulpd %%xmm7, %%xmm4\n\t"
"addpd %%xmm4, %%xmm2\n\t"
"mulpd %%xmm6, %%xmm7\n\t"
"addpd %%xmm7, %%xmm3\n\t"
"jne LOOP%=\n\t"
Mais je souffre d'un défaut de segmentation pour la lecture non valide.
Cela me semble amusant. Pourquoi?
Il serait beaucoup plus rapide pour vous d'exécuter cela sous un débogueur et voir quelle instruction provoque la faute, puis regardez les registres pour voir ce qu'il faisait au lieu de nous demander. – wallyk
S'il vous plaît ne pas afficher le code sous le titre "segfault", puis dire qu'il fonctionne correctement. –
Je ne vois pas pourquoi vous avez changé le code qui fonctionnait correctement en premier lieu. –