Bonjour tout le monde.
Tout d'abord, je tiens à préciser que je suis débutant en assembleur.
Pour la petite histoire, j'ai une application écrite en C++ qui récupère un flux d'image provenant d'une caméra dans un filtre DirectShow qui est ensuite transformé pour être enregistré dans un fichier au format AVI.
Cette caméra me délivre les images en RGB8, ce qui signifie que chaque pixel de l'image est codé sur 24 bits : 8bits rouge - 8bits vert - 8bits bleu. Le problème est que la caméra me fournit les octets en utilisant le format big endian et que Windows part du principe que c'est du little endian... Il se trouve que je n'ai trouvé aucun moyen de signaler à DirectShow que les données arrivent sous forme de BGR8 au lieu de RGB8 (inversion des octets rouge <=> bleu, ce qui équivaut à du BGR au lieu de RGB...).
Il me faut donc permuter le premier octet du pixel avec le dernier.
Donc je me suis dit que ce genre de permutation devrait être beaucoup plus performante si on la faisait en assembleur qu'en C++...
En l'occurence, c'est du MASM, mais étant donné que je n'utilise que des fonctions très basiques, j'imagine que ça n'a pas beaucoup d'importance.
On en arrive à ma question (ouf... ) : j'ai réussi à faire ma permutation mais je n'ai pas compris certaines choses.
Voilà mon code
Pourquoi je peux pas récupérer la valeur de p dans al en faisant MOV al, [p] ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 BYTE* p = (BYTE*)pFrame->pBuffer; unsigned long nbPixels = M_nWidth * m_nHeight; __asm { MOV ecx, nbPixels loop1: MOV edx, p MOV al, [edx] MOV ah, [edx + 2] MOV [edx], ah MOV [edx + 2], al ADD p, 3 DEC ecx JNZ loop1 }
Combien de cycle sont nécessaire pour effectuer un tour de la boucle ? (j'hésite entre 3 et 4, mais j'avoue que cette partie la de l'assembleur reste assez obscure pour moi...)
Comment améliorer ce petit bout de code ?
Merci d'avance !
Partager