Обмен числами в памяти

Тема в разделе "WASM.A&O", создана пользователем Marazm, 7 сен 2005.

  1. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    bogrus

    Примерно 0,972 микроватт-секунд мощности (CPU2Ghz,60W). Сколько в микрокаллориях затрудняюсь сказать.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    alpet

    Ага, но переходы :dntknw:



    Вот, Uri предложил замечательное решение:
    Код (Text):
    1.  
    2. mov ax,11110001b
    3. ror ax,1
    4. sar ax,1
    5. pushf
    6. rol ax,1
    7. popf
    8. rcl ax,1
    9. ret
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    IceStudent

    pushf-popf эквивалентно использованию дополнительного регистра (точнее переменной в стеке) помимо eflags.

    С использованием доп. регистра все просто становится:
    Код (Text):
    1.  
    2.         mov ax, 01000h ;; получится 0008h     
    3.         ror ax, 3  
    4.         mov bx, ax     
    5.         ror ax, 9  
    6.         xor bx, eax
    7.         and bx, 1
    8.         xor ax, bx     
    9.         rol ax, 9
    10.         xor ax, bx     
    11.         rol ax, 3
    12.  


    Хотя при этом 4 раза медленный циклосдвиг используется.
     
  4. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    На си это делается ещё смешнее, выглядит так :

    a^=b^=a^=b;



    Траслируется в те же три xor команды. Но на практике это делать не нужно. Просто глупый выпендрёж. Обычный обмен работает быстрее. А xor вариант тормозит конвеер.
     
  5. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Proteus>глупый выпендрёж

    это было придумано еще тогда, и на тех камнях, когда xchg не было :)
     
  6. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    Вот код реверса порядка битов, из него легко можно получить идею как менять 2 бита не используя ничего кроме eflags и временного регистра АЛУ (test).
    Код (Text):
    1.  
    2. test al, 81h
    3. jpe skip1
    4. xor al, 81h
    5. skip1:
    6. test al, 42h
    7. jpe skip2
    8. xor al, 42h
    9. skip2:
    10. test al, 24h
    11. jpe skip3
    12. xor al, 24h
    13. skip3:
    14. test al, 18h
    15. jpe skip4
    16. xor al, 18h
    17. skip4:
    18.  


    вход и выход ес-но в al, никакие регистры не трогаются, а то что есть условные прыжки - плевать, т.к. они очень короткие и в очередь укладываются...



    p.s. почитал выше и понял, что Black_mirror меня опередил с идеей :)
     
  7. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Nothing

    Да, jz в моём коде явно лишний ...
     
  8. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Парни, смотрю понесло вас нетуда;))) Я показал ей варинт на C++ и дизасм ентого варианта. Как и следовало ожидать она сказала мне мол "вы не знаете специфики языков программирования и лезите в такие дебри. ваш вариант не правильный! мне некогда". Вот такие дела;) Всем спасибо.