Salut,
Ta macro ROL fait en fait un equivalent de ror en assembleur (rotation des bits vers la droite).
Si tu ne mets pas de constante dans b pour ta macro, le compilateur ne te mettra aucune alerte. D'ailleurs avec ta macro (si tu la corriges en un vrai rol), la rotation se fait très bien même avec de gros nombres (par contre on dirait qu'un rol en assembleur ne peut supporter d'opérande de plus de 255 pour la rotation, tandis que ta macro supportera plus.
Si tu as quand même des soucis, tu peux utiliser une fonction qui découpe la rotation en plusieurs rotations distinctes de moins de 32 bits. Un exemple:
#include <stdio.h>
// Ta rotation ror corrigée en rol
#define ROL32(x,b) (((x) << (b)) | ((x) >> (32 - (b))))
//La rotation en assembleur
unsigned int test_asm()
{
__asm__("movl $100, %eax\n\t"
"roll $255, %eax"
);
}
// La rotation découpée en plusieurs rotations distinctes
unsigned int rol(unsigned int nb, unsigned int r)
{
for (; r>31; r-=31)
{
nb = ROL32(nb, 31);
}
nb = ROL32(nb, r);
return nb;
}
int main(int argc, char **argv)
{
unsigned int a=100;
unsigned int r=255;
//Affichage de la rotation en assembleur
printf("%u\n", test_asm() );
//Affichage de la rotation en C
//Marche aussi, chez moi, avec printf("%u\n", ROL32(a,r) );
printf("%u\n", rol(a,r) );
return 0;
}