|
|
| Посл.отвђт | Сообщен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 Спасибо всем ответившим, но по моему они не заметили вопрос, я знаю что праверка идет на ноль или один (я писал об этом), меня интересует как на С++ написать данную праверку. Сенкс ещё раз. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083 |