Рассмотрим последовательности целых чисел, у которых сброшен некоторый бит. Последовательность чисел со сброшенным нулевым (младшим) битом: 0, 2, 4, 6, 8, ... Последовательность чисел со сброшенным первым битом: 0, 1, 4, 5, 8, 9, ... Нужно написать безбранчевую последовательность команд для получения следующего числа последовательности. Для нулевого бита это очень просто, всего одна команда: ADD EAX,2 Нужно написать код для других битов.
captain cobalt Неправильно Для нулевого бита это shl eax,1 Для остальных (случай eax < 32768), первое что придумалось - ror eax,n shl ax,1 rol eax,n
Следует отметить отличие между: 1. По заданному числу последовательности вычислить следующее число 2. По заданной позиции в последовательности вычислить число на этой позиции ADD EAX,2 - это первый пункт, сдвиги - это второй пункт. Задача ставится как первый пункт.
captain cobalt Все просто По заданному числу узнаем его позицию, ror eax,n shr eax,1 rol eax,n inc eax ror eax,n shl eax,1 rol eax,n и задача сводится к пункту номер два ))
Вроде так. Насчет правильности синтаксиса не уверен. add eax,2*n+1 and eax,not (1 shl n) [добавлено] опс. так по ходу правильно. add eax,(1 shl n)+1 and eax,not (1 shl n)
В обратном порядке, кажется можно так Код (Text): xor eax,eax @@: dec eax and eax,not (1 shl n) jnz @b