· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› SHR & JNB

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Авг 26, 2004 08:26:15

Прива народ!

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

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

1. shr esi, 1
2. jnb ......

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

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

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

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

Сенкс.


Дата: Авг 26, 2004 10:01:26

Возможно проверка числа на "минус" типа
if (a<0)
{
...
}


Дата: Авг 26, 2004 10:22:15

Минус тут ни при чем.
В данном случае jnb - это проверка того, что исходное число четное:
b = a / 2;
if (a and 1) = 0 //=jnb
...


Дата: Авг 26, 2004 10:23:04

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

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

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


Дата: Авг 26, 2004 10:24:09

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


Дата: Авг 26, 2004 10:33:29 · Поправил: leo

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


Дата: Авг 26, 2004 10:43:10

Да, не прав. Т.к. в C TRUE=01h => возможен вариант проверки
if (a)
{
....
}

shr esi,1
и
or esi, esi
Занимают 2 байта
q_q
test esi, 1 Занимает 6 байт :)


Дата: Авг 26, 2004 10:49:36

Да, вот еще дальше в теме "Обратная функция?" стоит проверка на "0", так что leo скорее всего прав.


Дата: Авг 26, 2004 11:03:44 · Поправил: leo

Если это к теме "Обратная функция", то там однозначно идет побитовая проверка esi и на каждой единичке выполняются xor-ы.


Дата: Авг 26, 2004 11:18:00

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

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

Занимает 6 байт
Жизнь заставит, больше отдашь.


Дата: Авг 26, 2004 11:45:41 · Поправил: leo

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


Дата: Авг 26, 2004 11:51:52

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

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

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


Дата: Авг 26, 2004 11:58:17 · Поправил: leo

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

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


Дата: Авг 26, 2004 12:18:53 · Поправил: q_q

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

спорить по пустякам ... тебе видимо это нравится
Не аргументированное, грубое заявление. :(


Дата: Авг 26, 2004 12:33:04

Спасибо всем ответившим, но по моему они не заметили вопрос, я знаю что праверка идет на ноль или один (я писал об этом), меня интересует как на С++ написать данную праверку.

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

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083