Генерация XOR

Тема в разделе "WASM.BEGINNERS", создана пользователем GeNeZiS, 29 янв 2009.

  1. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Доброго времени суток.
    Вопрос такой:
    Необходимо сгенерировать инструкцию XOR dword ptr [REG32_1], REG32_2
    Где REG32_1 и REG32_2 - указанные регистры (0..7)
    Для генерации XOR REG32_1, REG32_2 делаю так:
    Код (Text):
    1.         mov bh, <REG32_1>
    2.         mov bl, <REG32_2>
    3.  
    4.         xor eax, eax
    5.         mov al, 30h
    6.         or  ax, 0C003h
    7.         or  ah, bl
    8.         ror     ah, 3
    9.         or  ah, bh
    10.         rol     ah, 3
    11.         stosw
    Что в этом коде нужно поправить, чтобы получить XOR dword ptr [REG32_1], REG32_2 ?

    Благодарю за внимание.
     
  2. Coderess

    Coderess New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    41
    Код (Text):
    1. ; myxor
    2. myxor proc x:DWORD, y:DWORD
    3. ;Получаем аргументы
    4. MOV     EDX, y
    5. MOV     EAX, x
    6. ;Считаем
    7. MOV     ECX, EDX
    8. OR      ECX, EAX
    9. AND     EAX, EDX
    10. NOT     EAX
    11. AND     ECX, EAX
    12. ;Результат в EAX
    13. MOV     EAX, ECX
    14. myxor endp
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а зачем так усложнять
    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
     
  4. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Проблема решена! Спасибо вам.
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    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