Доброго времени суток. Вопрос такой: Необходимо сгенерировать инструкцию XOR dword ptr [REG32_1], REG32_2 Где REG32_1 и REG32_2 - указанные регистры (0..7) Для генерации XOR REG32_1, REG32_2 делаю так: Код (Text): mov bh, <REG32_1> mov bl, <REG32_2> xor eax, eax mov al, 30h or ax, 0C003h or ah, bl ror ah, 3 or ah, bh rol ah, 3 stosw Что в этом коде нужно поправить, чтобы получить XOR dword ptr [REG32_1], REG32_2 ? Благодарю за внимание.
Код (Text): ; myxor myxor proc x:DWORD, y:DWORD ;Получаем аргументы MOV EDX, y MOV EAX, x ;Считаем MOV ECX, EDX OR ECX, EAX AND EAX, EDX NOT EAX AND ECX, EAX ;Результат в EAX MOV EAX, ECX myxor endp
а зачем так усложнять xor dword ptr [reg], reg; 0x31 0x<mod r/m> (mod=0) следовательно mov al, 0x31 mov ah, reg1 shl ah, 3 or ah, reg2 (если reg1 и reg2 константы, для макроподстановки, то mov ah, reg1*8+reg2) (если очень хочется) mov ecx, reg2 mov eax, reg1 lea eax, [eax*8+ecx] mov ah, 0x31 xchg al, ah
GeNeZiS 1 вариант. A ^ B = (A & (~B)) | (B & (~A)) 2 вариант. Если учесть, что A & (~A) = B & (~B)=0 тогда A ^ B = (A & (~B)) | (B & (~A)) | (A & (~A)) | (B & (~B))=(A | B)&(~B | ~A) = = (A | B) & (~(A & B)) 3 вариант. A ^ B = ~((A & B)|((~A)&(~B))) 4 вариант. A | B = (A & B) + (A ^ B) тогда A ^ B = (A | B) - (A & B) 5 вариант. A + B = (A ^ B) + (A & B)>>1 тогда A ^ B = A + B - (A & B)>>1 6 вариант. -(A & B)=~(A & B) +1 тогда A ^ B = A + B + 2 + (~(A & B))>>1 = = A + B + 2 + ((~A)|(~B))>>1