bonjour,
voici un programme écrit en c++
(il permet de passer d'une image en couleur 24bits(ARGB) a une image en 256 niveaux de gris(toujours sur 24bits))
____________________________________________
for (a=0;a<256;a++){A[a]=a*65793;}
for (a=0;a<256;a++){
R[a]=a*306;V[a]=a*601;B[a]=a*117;
}
do{
rgb=*pixel;
a=((rgb & 0xff000000));
r=((rgb & 0xff0000)>>16);
g=((rgb & 0x00ff00)>>8);
b=((rgb & 0x0000ff));
rgb=(R[r]+V[g]+B[b])>>10;
*pixel++=a | A[rgb];
}while(--len);
}
____________________________________________
je l'ai traduit en asm
____________________________________________
asm("pusha");
asm("mov ebx,_mem_eax");
asm("mov esi,_mem_edx");
asm("boucle:");
asm("mov ecx,[ebx]");
asm("push ebx");
asm("mov eax,29");// b*117/4
asm("mul cl");
asm("mov ebx,eax");
asm("mov eax,150");// g*601/4
asm("mul ch");
asm("add ebx,eax");
asm("ror ecx,8");
asm("mov eax,76");// b*306/4
asm("mul ch");
asm("add eax,ebx");
asm("shr eax,8");
asm("mov cl,al");
asm("mov ch,al");
asm("rol ecx,8");
asm("mov cl,al");
asm("pop ebx");
asm("mov [ebx],ecx");
asm("add ebx,4");
asm("sub esi,1");
asm("jne boucle");
asm("popa");
____________________________________________
pourriez-vous me re-ecrire se programme en asm svp.
il me fraudai :
_un programme 'plus propre' que le mien
_un programme avec un pré-calcul (comme la version c)
_un programme avec des instructions mmx
_un programme avec des instructions sse
_un programme avec des instructions sse2
je sais qu'il existe la lib. opencl , mais mon but est d'apprendre et d'élargir mes connaissances en asm.
pour résumer , il me fraudai un tuto pour chaque programme demandé.
merci.