В регистре EAX содержится 32х-разрядное число. Если все 8 тетрад(группы по 4 разряда) различны, нужно установить EAX=-1, а если есть совпадающие - установить EAX=0. Например, для чисел 12345678h или 5A6B7C8Dh на выходе должно быть -1, а для чисел 00000000h, FFFFFFFFh или 0ABCDEF0h нужно установить EAX=0. Оптимизируем по размеру, переходы и вызовы подпрограмм использовать нельзя.
Записать все числа с разными тетрадами (их должно быть не много) в таблицу и упорядочить их по возрастанию. Потом можно использовать двоичный поиск по таблице. Но чувствую у тебя есть решение на порядок лучше.
Black_mirror Задачку можно свести к проверке наличия нулевых тетрад: сдвигаем влево через CF на 4 бита и делаем xor с исходным вектором, если есть нулевые тетрады, значит есть совпадающие тетрады. И так до первого появления нулевой тетрады.
murder Можно сделать и таблицу, только её нужно будет добавить к размеру кода crypto А зачем сдвигать через CF?) Направление конечно верное, по моим прикидкам такой код без переходов команд 40 займёт, но какие-то возможности я пока видимо упустил. всем Можно решать и с переходами, такие программы в своей категории сравнивать будем.
Произведение шести комбинаций xor. Если на выходе 0, значит есть совпадения. Если не 0, значит нету. Как не ноль превратить в -1 без перехода, пока не придумал.
либо XOR либо SUB, кроме EAX еще 7 регистров EBX, ECX, EDX, ESI, EDI, EBP, ESP если в каждый скопировать EAX а потом сдвинуть каждый ROR или ROL через 4 бита тогда покроем все 32 разрядное поле, дальше не придумал
Кажись нашёл, можно (sbb результат, (dec результат)). Если в результате был 0, то в cf будет единица, иначе 0. Теперь используем какую-нибудь операцию сдига с занесением cf в регистр. Ну а дальше всё совсем тривиально.
Тьфу тупанул, конечно никого сдвига не нужно, главное cf получить, а дальше просто сложить или вычесть с учётом этого флага. ^)
Serg50 Это совсем не та задача, мы проверяем не то, что все тетрады равны, а то что все они уникальны.
Самое простое завести таблицу на 16 байт, проинициализировать нулями. Затем откусываем ниблы по кусочку и увеличиваем на единицу счетчик соответствующей ячейки. Если в конце в таблице содержатся значения 2 и больше, то есть повторения.
Разумеется, можно организовать и досрочный выход, при попытке записи в ячейку где уже есть 1 сразу отваливать.
Black_mirror А проверять наличие нулевой тетрады в конкретном месте можно тупо выделяя эту тетраду, ксоря с маской и сравнивая полученный результат с той же маской (потом сдвиг на 4 влево...)