SHR & JNB

Тема в разделе "WASM.RESEARCH", создана пользователем b10t, 26 авг 2004.

  1. b10t

    b10t New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2003
    Сообщения:
    31
    Прива народ!



    Сразу извеняюсь за вопрос, сам чтото допедрить немогу :dntknw:(



    Что делает кусок кода в переводе на С++:



    1. shr esi, 1

    2. jnb ......



    1 - понятно что делим число на 2 и устанавливаем CF равным выдвигаемому биту.

    2 - переход если CF = 0



    На С++ с первым вопросов нет:



    UINT a, b;

    a = 200;

    b = a / 2; // shr esi, 1



    а вот с "jnb ...." траблы, что здесь должно быть на С++ ?



    Сенкс.
     
  2. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    Возможно проверка числа на "минус" типа
    Код (Text):
    1.  
    2. if (a<0)
    3. {
    4. ...
    5. }
    6.  
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Минус тут ни при чем.

    В данном случае jnb - это проверка того, что исходное число четное:

    b = a / 2;

    if (a and 1) = 0 //=jnb

    ...
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ChS

    Вправо - на минус?



    b10t

    Зачем завел вторую тему или она не имеет отношения к Обратная функция?



    Если к той теме, то нельзя рассматривать конкретную пару инструкций. Надо оценивать все связанное с esi.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leo

    Для проверки четности достаточно test esi,1.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    q_q

    "Для проверки четности достаточно test esi,1"

    В отличие от test esi,1 комбинация shr esi,1 и jnb дает деление на 2 и проверку четности "в одном флаконе". Это хороший пример того, что на asm-е можно получить более эффективный и изящный код, чем на языках высокого уровня.

    PS. С точки зрения алгоритма: в данном случае jnb - это проверка на 0 остатка от деления на 2. Согласно интеловскому мануалу флаг CF при shr esi,1 - это значение младшего бита esi, выталкиваемого при сдвиге.
     
  7. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    Да, не прав. Т.к. в C TRUE=01h => возможен вариант проверки
    Код (Text):
    1.  
    2. if (a)
    3. {
    4. ....
    5. }
    6.  


    shr esi,1

    и

    or esi, esi

    Занимают 2 байта

    q_q

    test esi, 1 Занимает 6 байт :)
     
  8. ChS

    ChS New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2003
    Сообщения:
    20
    Да, вот еще дальше в теме "Обратная функция?" стоит проверка на "0", так что leo скорее всего прав.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если это к теме "Обратная функция", то там однозначно идет побитовая проверка esi и на каждой единичке выполняются xor-ы.
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leo

    комбинация shr esi,1 и jnb дает деление на 2 и проверку четности "в одном флаконе"

    А флакон причем? Ты знаешь назначение исходного кода? Мне не очевидна необходимость деления на два. Я с таким же успехом могу сказать, что проверка четности при помощи test добавляет во флакон сохранение содержимого регистра.



    ChS

    А or тут причем?



    Занимает 6 байт

    Жизнь заставит, больше отдашь.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    q_q

    Флакон ни при чем.

    Почитай IA-32 Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference, конкретно Jcc и SAR/SAL/SHL/SHR. Если найдешь какой-то другой смысл использования jnb после shr, то непременно сообщи мировому сообществу.
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leo

    Флакон придумал ты.



    Единственное объяснение проверки бита "C" регистра флагов после shr XXX,1 - это проверка был ли этот бит равен нулю/единице, при этом команда сдвига обеспечивает подготовку следующего бита для проверки.



    Итого если очередной выдвигаемый бит не был младшим, то ни о какой четности речи быть не может. О чем я и написал "нельзя рассматривать конкретную пару инструкций".
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    q_q

    В "конкретной паре инструкций" конкретно записано - сдвиг на один бит. Каким же он может быть если не младшим ?



    PS: я тебе уже предлагал не спорить по пустякам, но тебе видимо это нравится.
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leo

    конкретной паре инструкций" конкретно записано

    По-твоему алгоритм в той теме занимается анализом четности на каждой итерации?



    спорить по пустякам ... тебе видимо это нравится

    Не аргументированное, грубое заявление. :dntknw:
     
  15. b10t

    b10t New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2003
    Сообщения:
    31
    Спасибо всем ответившим, но по моему они не заметили вопрос, я знаю что праверка идет на ноль или один (я писал об этом), меня интересует как на С++ написать данную праверку.



    Сенкс ещё раз.
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    q_q

    "..анализом четности на каждой итерации"

    Это не анализ четности, а какое-то заимствование из алгоритма умножения\деления двоичных полиномов. Аналогичный побитный анализ используется при формировании таблицы в CRC32:
    Код (Text):
    1.   SHR EAX,1
    2.   JNC @@skip //=jnb нет переноса => младший бит = 0
    3.   XOR EAX,$EDB88320
     
  17. b10t

    b10t New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2003
    Сообщения:
    31
    Народ, конечно извенити за двойной пост, но может Вы тогда ответите на первый вопрос если уже мы из топика вышли за рамки.



    З.Ы. Без обид.



    Сенкс.
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leo

    "это проверка того, что исходное число четное" - первое твое сообщение в этой ветке, теперь ты пишешь так "Это не анализ четности". И ты обвиняешь меня в споре по пустякам? Научись формулировать мысль, прежде чем постить.



    b10t

    Чем тебе не нравится код в ответе leo Авг 26, 2004 10:22:15?
     
  19. b10t

    b10t New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2003
    Сообщения:
    31
    q_q



    Сори, после твоего поста увидел, моему вопросу удовлетворяет.



    Сенкс.
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    b10t

    На паскале обычно это делают так:
    Код (Text):
    1. if (a and 1) = 0 then
    2.   b:=a shr 1
    3. else
    4. begin
    5.   b:=a shr 1;
    6.   ...... //здесь xor-ы
    7. end;