Bonjour, voici le code C que j'essaye de reproduire en assembleur:
Celui ci parcours chaque pixel d'une fenetre met l'alpha à zero puis modifie la couleur en récupérant la correspondance dans une table. Donc comme il y a 3 couleurs (R G B) la table fait 256*256*256 l'alpha n'ayant pas d'importance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for( DWORD n=0; n<H*W; n++ ) { screenbits[n]&=0x00ffffff; //l'alpha a zero screenbits[n] =ARGBTable[ screenbits[n] ]; //on récupère la correspondance }
Et voici le code assembleur qui ne fonctionne pas:
Voila peut etre que c'est le "mov eax, tbl" qui pose probleme je ne sait pas ne conaissant pas trop l'assembleur.
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
17
18
19
20
21 BYTE* src=(BYTE*)screenbits; BYTE* tbl=(BYTE*)ARGBTable; DWORD npix=H*W; __asm { mov ecx, npix //un compteur pour savoir quand on s'arrete mov ebx, src //pointeur vers les pixels dans ebx (32bits: ARGB) label: mov al, 0 mov [ebx+3],al //on met l'alpha a 0 jusque la le code fonctionne mov eax, tbl //on place eax en pointeur au début du tableau de correspondance add eax, [ebx+0] //avance le pointeur (ARGBTable[ screenbits[n] ];) mov edx, [eax+0] //on récupère la nouvelle valeur dans edx mov [ebx+0], edx //enfin on remplace le pixel par la nouvelle valeur add ebx,4 //on avance le pointeur d'un pixel (4 octets) ca c'est bon dec ecx //on décrémente le compteur, ca c'est bon jnz label //si le compteur est positif ou nul on poursuit la copie }
Merci
Partager