Код (Text): а так короче: mov eax,x bt dword [eax],0 adc dword [eax],0 PS. надеюсь я все правильно понял
А что значит до кратной степени двойки ? Как я понял условие, 3 округляется к 4, 6 к 8, 13 к 16, etc. Так ?
Если так, то у Уоррена есть несколько глав по округлению к степени двойки Код (Text): dec eax mov ecx,eax shr eax,1 or eax,ecx mov ecx,eax shr eax,2 or eax,ecx mov ecx,eax shr eax,4 or eax,ecx mov ecx,eax shr eax,8 or eax,ecx mov ecx,eax shr eax,16 or eax,ecx inc eax
До показательной кратности разумеется. До 2<sup>2</sup>, 2<sup>4</sup>,....,2<sup>2n</sup> (где n любое натуральное)
На ум приходит добавить такие строки, но что-то уже слишком много кода , должен быть простой вариант! Код (Text): test eax,01010101010101010101010101010101b setz cl shl eax,cl
да, блин, опять не внимательно прочитал и округлил до кратности 2. пол пятого утра было, надо было спать =(
> "должен быть простой вариант!" Что-то очень просто не получается Код (Text): ;eax <- x xor ecx,ecx xor edx,edx bsr ecx,eax setnz dl ;контроль x = 0 shl edx,cl cmp edx,eax ;контроль x = 2^k setb bl and cl,1 ;чет\нечет степень xor cl,bl add cl,bl ;нечет -> +1, чет -> 0 или +2 shl edx,cl ;x <- edx
Код (Text): xor edx, edx inc edx bsr ecx, eax jz @3 test ecx, edx jnz @1 bsf eax, eax cmp eax, ecx je @2 inc ecx @1:inc ecx @2:xchg eax, edx shl eax, cl @3:
Вход - EAX, выход - EDX Код (Text): xor edx, edx bsf ebx, eax jz done bsr eax, eax sub ebx, eax adc al, 1 and al, 0FEh bts edx, eax done:
А как правильно 0 и 1 округлять ? По условию: "До 2<sup>2</sup>, 2<sup>4</sup>,....,2<sup>2n</sup> (где n любое натуральное)", т.е. 0..3 округляется до 4 и никаких нулей и единиц ? Тогда все варианты придется подправлять... PS: bogrus нашел таки простой вариант А я как пень бродил вокруг да около декремента, да как всегда свернул на дубовый путь
Код (Text): xor ecx, ecx xor edx, edx mov eax, [b]X[/b] bsr ecx, eax bsf edx, eax cmp edx, ecx adc ecx, 1 and ecx, -2 mov eax, 1 shl eax, cl
Да, похоже 0..1 надо к 4 округлять. Кстати, макс. значение x = 40000000h. Если больше, то на выходе получится 33 бита. Вход - eax, выход - edx Код (Text): cdq mov dl, 2 cmp eax, edx cmovb eax, edx dec eax bsr ecx, eax or cl, 1 shl edx, cl bogrus, не забывай проверять на числах 0 и 1.
_BC_ CMOVcc - вещь полезная, но старички i486 и P\PMMX не знают о ее существовании Если 1 -> 4, а 0 и переполнение -> 0, то вариант bogrus'а только упрощается (уменьшается число комплексных инструкций): Код (Text): dec eax xor ecx,ecx ;! not documented см.PS bsr ecx,eax or cl,1 mov eax,2 shl eax,cl Если 0 -> 4, то нужно заменить shl на rol и добавить коррекцию 0..3 -> 4: Код (Text): ........... rol eax,cl add eax,3 and eax,-4 PS: Я считал, что BSR ecx,eax при eax = 0 оставляет ecx unchanged и по жизни так оно и есть. Перечитал на всякий случай IA-32, а там "destination operand is undefined" ?!. Это что - интеловская перестраховка ?
_BC_ Точно, а я это упустил из виду, наоборот мучался, чтобы из нуля и 1 получить единицу leo Ага, но чую это ещё не самый простой вариант Код (Text): mov ecx,1 bsr ecx,eax or ecx,1 mov eax,2 rol eax,cl