Прива народ! Сразу извеняюсь за вопрос, сам чтото допедрить немогу ( Что делает кусок кода в переводе на С++: 1. shr esi, 1 2. jnb ...... 1 - понятно что делим число на 2 и устанавливаем CF равным выдвигаемому биту. 2 - переход если CF = 0 На С++ с первым вопросов нет: UINT a, b; a = 200; b = a / 2; // shr esi, 1 а вот с "jnb ...." траблы, что здесь должно быть на С++ ? Сенкс.
Минус тут ни при чем. В данном случае jnb - это проверка того, что исходное число четное: b = a / 2; if (a and 1) = 0 //=jnb ...
ChS Вправо - на минус? b10t Зачем завел вторую тему или она не имеет отношения к Обратная функция? Если к той теме, то нельзя рассматривать конкретную пару инструкций. Надо оценивать все связанное с esi.
q_q "Для проверки четности достаточно test esi,1" В отличие от test esi,1 комбинация shr esi,1 и jnb дает деление на 2 и проверку четности "в одном флаконе". Это хороший пример того, что на asm-е можно получить более эффективный и изящный код, чем на языках высокого уровня. PS. С точки зрения алгоритма: в данном случае jnb - это проверка на 0 остатка от деления на 2. Согласно интеловскому мануалу флаг CF при shr esi,1 - это значение младшего бита esi, выталкиваемого при сдвиге.
Да, не прав. Т.к. в C TRUE=01h => возможен вариант проверки Код (Text): if (a) { .... } shr esi,1 и or esi, esi Занимают 2 байта q_q test esi, 1 Занимает 6 байт
Если это к теме "Обратная функция", то там однозначно идет побитовая проверка esi и на каждой единичке выполняются xor-ы.
leo комбинация shr esi,1 и jnb дает деление на 2 и проверку четности "в одном флаконе" А флакон причем? Ты знаешь назначение исходного кода? Мне не очевидна необходимость деления на два. Я с таким же успехом могу сказать, что проверка четности при помощи test добавляет во флакон сохранение содержимого регистра. ChS А or тут причем? Занимает 6 байт Жизнь заставит, больше отдашь.
q_q Флакон ни при чем. Почитай IA-32 Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference, конкретно Jcc и SAR/SAL/SHL/SHR. Если найдешь какой-то другой смысл использования jnb после shr, то непременно сообщи мировому сообществу.
leo Флакон придумал ты. Единственное объяснение проверки бита "C" регистра флагов после shr XXX,1 - это проверка был ли этот бит равен нулю/единице, при этом команда сдвига обеспечивает подготовку следующего бита для проверки. Итого если очередной выдвигаемый бит не был младшим, то ни о какой четности речи быть не может. О чем я и написал "нельзя рассматривать конкретную пару инструкций".
q_q В "конкретной паре инструкций" конкретно записано - сдвиг на один бит. Каким же он может быть если не младшим ? PS: я тебе уже предлагал не спорить по пустякам, но тебе видимо это нравится.
leo конкретной паре инструкций" конкретно записано По-твоему алгоритм в той теме занимается анализом четности на каждой итерации? спорить по пустякам ... тебе видимо это нравится Не аргументированное, грубое заявление.
Спасибо всем ответившим, но по моему они не заметили вопрос, я знаю что праверка идет на ноль или один (я писал об этом), меня интересует как на С++ написать данную праверку. Сенкс ещё раз.
q_q "..анализом четности на каждой итерации" Это не анализ четности, а какое-то заимствование из алгоритма умножения\деления двоичных полиномов. Аналогичный побитный анализ используется при формировании таблицы в CRC32: Код (Text): SHR EAX,1 JNC @@skip //=jnb нет переноса => младший бит = 0 XOR EAX,$EDB88320
Народ, конечно извенити за двойной пост, но может Вы тогда ответите на первый вопрос если уже мы из топика вышли за рамки. З.Ы. Без обид. Сенкс.
leo "это проверка того, что исходное число четное" - первое твое сообщение в этой ветке, теперь ты пишешь так "Это не анализ четности". И ты обвиняешь меня в споре по пустякам? Научись формулировать мысль, прежде чем постить. b10t Чем тебе не нравится код в ответе leo Авг 26, 2004 10:22:15?
b10t На паскале обычно это делают так: Код (Text): if (a and 1) = 0 then b:=a shr 1 else begin b:=a shr 1; ...... //здесь xor-ы end;