Почему пишут xor eax,eax, а не or eax,eax?

Тема в разделе "WASM.BEGINNERS", создана пользователем MEPOX, 17 авг 2008.

  1. MEPOX

    MEPOX New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    259
    Почему пишут xor eax,eax, а не or eax,eax? А правда, почему?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    MEPOX
    Потому же, почему не пишут inc ecx или div ebx или add esi,edi вместо xor eax,eax.
     
  3. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    MEPOX

    Вместо or eax, eax можно написать nop или xchg eax, eax или mov eax, eax :))))))))))))))
     
  4. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Очень ошибаетесь. Исходная изменяет флаги.
     
  5. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Потому что это 2 совершенно разные операции.
     
  6. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    asmfan
    Очень ошибаетесь. Исходная изменяет флаги.

    That's right. Но я никогда не проверяю флаги после логических операций, кроме того челу, создавшему тему, скорее всего, тоже это по барабану... :)
     
  7. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    zhindos
    очень простой способ проверить регистр на ноль

    к примеру вместо
    cmp eax, 0
    jz...

    намного эффективнее будет
    or eax, eax
    jz.....
     
  8. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Magnum

    В данном случае использую:
    test eax, eax
    jz...

    Кому что привычнее...
    (кстати как мне кажется test немного быстрее)
     
  9. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    MEPOX
    or eax,eax оставит eax без изменений
    xor eax,eax обнулит регистр


    к стате что быстрее or или test?
     
  10. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    2FED
    где-то на рсдн писали, что тест
     
  11. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    2FED
    Не "к стате", а "кстати". И кстати, по скорости они будут одинаковы (потому что обе являются простейшими инструкциями, не требующими нескольких тактов на свою обработку -- в отличие от деления, например), а вот по объёму кода могут различаться, если память не изменяет (OR будет иметь такой же или более короткий код).
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    SII
    И 'test' и 'or' имеют короткую форму при использовании 'cmd eax, imm'.

    Magnum
    leo здесь как-то писал, что test быстрее (как всегда, подробно), но что-то не могу найти его ответ. Может кто-нибудь вспомнит ключевое слово?
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Mika0x65
    А если проверять нужно не аккумулятор, а другой регистр?
     
  14. MEPOX

    MEPOX New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    259
    А я видел где-то что там в комментах к исходнику написано что обнуляет.. опечатка, наверное=)
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    SII
    Тогда полная форма. Но и в полной форме размер одинаковый будет.
     
  16. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    MEPOX формат or такоф

    0110
    0101
    -----
    0111

    тоесть если хотябы один бит равен 1 значи будет еденица.

    у xor

    0110
    0101
    -----
    0011

    если равны значит 0 если не равны то 1

    терь сам посуди что будет с регистром при xor eax,eax и or eax,eax =)
     
  17. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    Тоже интересует что лучше CMP TEST или OR

    Агнер Фог:
     
  18. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    z_x_spectrum
    Сравните. Штук 10 тестов в цикле оборотов на пару миллиардов выровненом по границе страницы и счет по рдтсц. Тоже для ор-а. Интересно даже что у вас получится.
     
  19. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Mika0x65
    В общем-то да. Если TEST с константой -- тогда он длиннее, а если регистр сам с собой -- одинаково. Что-то забыл про то, что не только с константой использовать можно :)
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Повторенье - мать ученья ;)
    1) Латентность операций or, xor, test на всех процах одинакова и различие между ними по скорости заключается только в возможности их распараллеливания ("спаривания") с другими командами.
    2) Or r,r - это обычная операция, читающая и "изменяющая" регистр (фактически значение r не изменяется, но проц.этого "не знает" и считает, что значение r изменилось), поэтому or должна ждать выполнения предыдущей операции, изменяющей r, и следующая операция, читающая r, должна ждать завершения or.
    3) Test r,r в отличие от or, не изменяет значение регистра, проц об этом "знает" и может выполнять следующую операцию c r параллельно (или даже раньше), чем test. Поэтому во всех мануалах по оптимизации рекомендуют использовать для проверки r на 0 именно test r,r.
    4) Хor r,r на всех процах, начиная с P6, рассматривается как спецоперация по обнулению регистра (т.е. проц.специально распознает test r,r также как и nop). На процах старше PIII test r,r считается независимой операцией, которая может выполняться одновременно или даже раньше предыдущих операций, изменяющих r. Кроме того во всех P6 xor r,r служит для пометки обнуления старших разрядов регистра для устранения partial register stall (штраф на чтение r32 после изменения r8 или r16)