Или это я туплю, или не знаю даже что и думать. Вот такой код: #include <stdio.h> int main(int argc, char **argv) { unsigned int a = 0x0a; unsigned int i; #if 0 /* case 1 */ __asm ( "bsrl %1, %0\n\t" :"=c"(i) : "m"(a) ); #else /* case 2 */ __asm ( "bsrl %1, %0\n\t" :"=c"(i) : "q"(0x0a) ); #endif printf("a %u (0x%08x), i %u\n", a, a, i); return 0; } $ gcc -Wall -O0 -g btst.c -o btst $ ./btst a 10 (0x0000000a), i 3 То есть оно возвращает индекс самого старшего установленного бита, но только считая не с того конца (???!) В обоих случаях (case 1 && case 2) Что бы это значило?