Как реализовать inc используя только and not shl shr

Тема в разделе "WASM.ASSEMBLER", создана пользователем nobodyzzz, 8 дек 2006.

  1. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Hi all
    собственно субж. как-то по долгу учебы реальзовывал сложение, вычитание, умножение и деление исключительно при помощи лог.операций но исходник к сожелению утерян. а тут стало интересно=)
    Заранее благодарен =)
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    nobodyzzz
    Уверен?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Пардон, xor в списке разрешенных инструкций нет. Тогда:
    Код (Text):
    1. op_add:
    2.  push ebp
    3.  mov ebp, esp
    4.  
    5.  mov eax, [ebp + 0x8]
    6.  and eax, [ebp + 0xC]
    7.  not eax
    8.  
    9.  mov edx, [ebp + 0x8]
    10.  or edx, [ebp + 0xC]
    11.  and eax, edx
    12.  
    13.  mov edx, [ebp + 0x8]
    14.  and edx, [ebp + 0xC]
    15.  shl edx, 0x1
    16.  
    17.  or eax, edx
    18.  
    19.  mov esp, ebp
    20.  pop ebp
    21.  ret
     
  4. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    a OR в сабже тоже нет
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    or - не лог операция?
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Как реализовать inc используя только and not shl shr :)
    впрочем, спор ни о чем: a|b= !(!a&!b)
    a^b=a!b | !ab
    хуже то, что все вышеперечисленные решения работают только для одноразрядных чисел
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Почему? Нормально работает для многоразрядных.
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    а ты скомпиль и проверь
    1+3=2
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Nouzui
    Пардон, не проверил :dntknw:.

    А кроме как поразрядного сложения кто-нибудь знает способ "за раз"?
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    гм..
    imho, impossible
     
  12. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Mika0x65
    Думаю, это невозможно, хотя доказательства не предложу. Но можно попробовать рассуждать следующим образом:

    Есть большое количество различных (не криптографических) checksum- и hash-функций. Некоторые, как adler32 или sdbm, работают на сложении и умножении и являются таким образом линейными в Z. Соответственно их легко обратить (Хеш функция). Некоторые, вроде примера Кнута, используют только битовые операции и являются таким образом линейными в соответствующем кольце полиномов. Опять же без проблем обращаются.

    Сложности начинаются тогда, когда вперемешку используются арифметические и битовые операции, пример - улучшенная версия djb. Если бы можно было свести сложение к битовым операциям, то в результате ее также стало бы возможно обратить.

    А поскольку это было бы слишком хорошо, чтобы быть правдой, то и выразить сложение через битовые операции не удастся ;) Если где напутал, поправляйте.
     
  13. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Сложение можно сделать таким циклом:
    do{
    C=A and B;
    A=A xor B=(not ((not A) and (not B))) and (not C);
    B=C shl 1;
    }while(B);
    В худшем случае выполняется столько раз, какова разрядность слова, поэтому его можно и развернуть.
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Black_mirror
    тут есть переход. с переходом это сделать поидее довольно легко
     
  15. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    называется суматор с параллельным переносом
    чем больше номер разряда, тем больше получается формула, но работают значительно быстрее (про больших разрядностях в несколько раз) последовательных сумматоров (или сумматоров с последовательным переносом), но большие апаратные затраты...
    Выгодной с точки зрения аппаратных затрат являются последовательно-параллельные сумматоры...

    формулы для последовательного инкрементора

    Q=A xor C0;
    W=A and C0;
    A текущий разряд
    С0 входной перенос (в 0 разряде = 1 если нужен инкремент)
    W выходной пперенос
    Q результирующий бит

    в проге будет выглядеть примерно так (не проверял)

    char A[32],Q[32],c0;
    //
    c0=1;
    while (i<32 && c0)
    {
    Q = A ^^ c0;
    c0 = A && c0;
    }
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Pushkoff
    так это и есть поразрядное сложение
    все равно не "за раз"