В регистрах EAX, EBX, ECX, EDX находятся 4 булевых массива по 32 элемента в каждом. Необходимо арифметически сложить соответствующие элементы(то есть получить 32 суммы которые могут принимать значения от 0 до 4) и в регистр EAX записать в соответствующий разряд 1, если сумма равна 1 и 0 в противном случае(сумму в явном виде получить необязательно, главное проверить что она равна 1). Например: Код (Text): EAX=00011111h EBX=00111101h ECX=1F001100h EDX=03001001h Результат: EAX=1C100010h Оптимизируем как обычно по размеру.
Бит результата установлен когда один и только один из операндов установлен. Для удобства обозначим a = ~A, b = ~B, c=~C, d=~D. Умножение - логическое И, сложение - логическое ИЛИ. R = Abcd + aBcd + abCd + abcD R = (Ab+aB)cd + ab(Cd+cD) Как известно, Ab+aB эквивалентно A xor B. R = (A xor B)cd + (C xor D)ab cd = ~C*~D = ~(C+D) R = (A^B)&~(C|D) | (C^D)&~(A|B) Получаем что-то вроде: Код (Text): mov esi, eax mov edi, ecx or esi, ebx ; A|B or edi, edx ; C|D xor eax, ebx ; A^B xor ecx, edx ; C^D not esi and ecx, esi not edi and eax, edi or eax, ecx
Код (Text): ;R = (A^B^C^D)&((A|B)^(C|D)) xor eax,ebx or ebx,eax xor eax,ecx or ecx,edx xor eax,edx xor ebx,ecx and eax,ebx
reverser У меня было R = ~( (~(A^B)|C|D) & (A|B|~(C^D)) ), но по длине тоже самое: Код (Text): mov esi,eax xor eax,ebx not eax or eax,ecx or eax,edx xor edx,ecx not edx or edx,ebx or edx,esi and eax,edx not eax
leo После такого гениального решения я даже не знаю, стоит ли мне сочинять задачки для которых не могу решения нормального придумать Думаю можно еще пооптимизировать вычисление: COUNT(A,B,C,D)==2 COUNT(A,B,C,D)==3 Еще интересная задачка: A=(COUNT(A,B,C)==2) при условии что дополнительной памяти использовать нельзя, то есть можно выполнять только операции: XOR A,B / XOR A,C / XOR B,A / XOR B,C / XOR C,A / XOR C,B AND A,B / AND A,C / AND B,A / AND B,C / AND C,A / AND C,B OR A,B / OR A,C / OR B,A / OR B,C / OR C,A / OR C,B NOT A / NOT B / NOT C Решается вроде за 5 команд, но как я пока не знаю.
COUNT(A,B,C,D)==2 пока везде продолжаю мысли leo =) Код (Text): ; r=((a^b)|(b^c))&~(a^b^c^d); XOR A,B XOR B,C XOR D,A XOR D,C OR A,B NOT D AND A,D
Proteus У меня для COUNT(A,B,C)==2 немного другое решение: Код (Text): XOR A,B XOR A,C OR B,A OR B,C XOR A,B