LINUX.ORG.RU

инструкция BSR


0

0

Или это я туплю, или не знаю даже что и думать.
Вот такой код:

#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) Что бы это значило?
anonymous

Ответ на: комментарий от anonymous_incognito

> Ты где-то перепутал порядок отсчёта или порядок аргументов.

Где? Просто я уже не знаю сколько раз пересмотрел, перечитал.
Ну не вижу я где ошибка :-((((( Не может же она на самом
деле работать неправильно.

anonymous
()

>То есть оно возвращает индекс самого старшего установленного бита, но только считая не с того конца

А с какого конца? :)

BSR сканирует от _самого_старшего_ к 0. Все правильно. Просто номер бита при сканировании уменьшается. А ты решил, что перед сканированием самому старшему биту присваевается номер 0 и номер бита увеличивается?

kosmonavt
()
Ответ на: комментарий от kosmonavt

> Просто номер бита при сканировании уменьшается. А ты решил, что перед сканированием самому старшему биту присваевается номер 0 и номер бита увеличивается?

Я так решил прочитав у товарища Зубкова,
"Assembler для DOS, Windows и UNIX" :
"Команда BSR сканирует источник, начиная с самого старшего бита,
и возвращает номер первого встретившегося ненулевого бита,
считая от нуля. То есть, если источник равен 0000 0000 0000 0010b,
то BSF возвратит 1, а BSR - 14."

Хотя в Intel Architecture Software Developer's Manual
сейчас читаю: "The bit index is an unsigned offset from bit 0 of the source operand"

Баг в книге?

Спасибо за ответ.

anonymous
()
Ответ на: комментарий от anonymous

>Команда BSR сканирует источник, начиная с самого старшего бита, и возвращает номер первого встретившегося ненулевого бита, считая от нуля.

>Баг в книге?

Скорее глюк. Оборот "считая от нуля" непонятно к чему относится. ИМХО, фраза о сканировании лишняя. Написал бы просто, что возвращает самый старший из выставленных в 1 битов.

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.