Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 03:34   #11
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от dino-4udo
А если использывать команды сканирования бит bsf или bsr, если находим единичный бит смотрим, что за ним (с помощью команду test или логические сдвиги shr/shl), если единица и следом за ней ноль -- увеличиваем счетчик, иначе двигаем к следующей единице????
dino-4udo
А почему цитата не полностью?
Цитата:
Сообщение от Mikl___
dino-4udo, используй команды сканирования бит bsf или bsr описание команд можно посмотреть в Иллюстрированный самоучитель по Ассемблеру
нашел единичный бит смотришь, что за ним (используй команду test или логические сдвиги shr/shl), если единица и следом за ней ноль -- увеличиваешь счетчик, иначе двигаешься к следующей единице
Программу пиши сам
Mikl___ вне форума Ответить с цитированием
Старый 17.02.2011, 03:44   #12
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от veniside
Просто крутим весь наш массив вправо и смотрим, а нет ли 6 (= 0110) в младших битах.
veniside
Отличное решение! Только в случае неудачи нужно сдвигать на один разряд, а если 0110 нашли -- сдвинуть сразу на три разряда

Есть еще одно решение - для выделения крайнего справа единичного бита (01011000-->0001000) Y=X AND(-X)
TEST (2*Y),X проверяем нет ли слева единички и, если есть, TEST(4*Y),X проверяем нет ли за единицей нуля, а дальше для обнуления крайнего справа единичного бита (01011000-->01010000) используется формула X = X AND(X - 1) и ищем следующий крайний справа единичный бит...

Последний раз редактировалось Mikl___; 17.02.2011 в 04:47.
Mikl___ вне форума Ответить с цитированием
Старый 17.02.2011, 10:01   #13
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> сдвинуть сразу на три разряда

согласен, оптимизацию я оставил для автора топика )

> Есть еще одно решение

Интересно. Фактически, это эмуляция работы bsf/bsr ) Неудобно только то, что все эти проверки слева/справа могут пересекать границы байт/слов, и красивого решения, кроме написания универсальной функции bittest(int bitindex), где bitindex может быть любое число (в том числе и больше 32/64), я не вижу.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.02.2011, 10:31   #14
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

veniside
почему неудобно? При выделении единичного бита смотришь значение, например для байта меньше ли 64 ? -- если осталось менее двух битов, происходит сдвиг вправо с выдвижением из предыдущего байта шести или семи битов (зависит от значения)
Только вот незадача, вместо нормального программирования на ассемблере преподаватель dino-4udo заставляет заниматься онанизмом в debug.exe

Последний раз редактировалось Mikl___; 17.02.2011 в 10:48.
Mikl___ вне форума Ответить с цитированием
Старый 17.02.2011, 10:50   #15
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

ну вот поэтому и неудобно ) не знаю, все эти проверки, сдвиги..

Вот, кстати, простая функция для проверки любого бита (индекс которого задан в ecx) в массиве байт с базой в esi:

Код:
     // ecx - bit index, starting from 0
     // esi - array base address
     mov    eax, ecx
     shr    eax, 5
     bt     [esi+eax], ecx
(Одна маленькая проблема только в том, что оно может читать 3 лишних байта, не принадлежащих массиву, в конце).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.02.2011, 13:31   #16
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Тоже была вчера бредовая идея с инструкцией bt, индексом и рассматриванием байтов по 2 'с нахлестом', тобишь грузим а ах содержимое источника, декриментим источник, с помощью индекса проходим по всем битам одного байта, ежели в конце видим что возникает нужная ситуация перейти к следующему байту-переходим в следующий, после рассмотрения одного байта вновь грузим слово из источника и так loop'аем sizeof mаssiv-1 количество раз. столкнулся с довольно веселым рядом проблем (вплоть до необходимости переворота битов в байте и геморрным расчетом того какой же это всеже вообще по счету бит, а также количеством счетчиков превосходящим количество регистров у армов) и заснул над реализацией. Проснувшись, осознал, что я индус
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 17.02.2011, 13:37   #17
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Удалено пользователем Mikl___

Последний раз редактировалось Mikl___; 17.02.2011 в 13:49.
Mikl___ вне форума Ответить с цитированием
Старый 17.02.2011, 13:47   #18
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Даже и не знаю что вам ответить, так как совсем не понял вопроса, но насчет ***, могу сказать, что с такими не знаком. Вкратце обо мне: я действительно PinHead, у меня в голове гвозди и если вдруг вы откроете шкатулку-они (а следовательно и я) придут и заберут!
Нет, ну правда..

Последний раз редактировалось yuran666666; 17.02.2011 в 14:01.
yuran666666 вне форума Ответить с цитированием
Старый 17.02.2011, 13:51   #19
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

yuran666666
Я удалил сообщение от греха, просто думал есть еще точки соприкосновения помимо этого сайта, если обидел, извините...
Mikl___ вне форума Ответить с цитированием
Старый 17.02.2011, 13:58   #20
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Что вовсе даже есть не беда не узрел абсолютно никаких попираний в отношении моих чести и достоинства. К тому же любые возможные имена бога наглые каббалисты сколько уже лет брутфорсят, а он их и наказал то всего один раз и то Мадонной. Поэтому возучимся пониманию у Главного.
PS: несмотря ни на что, шкатулку Ламоршана открывать все же не рекомендую
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти байт максимальным количестов единиц и байт с максмальным количеством нулей и разность (ассемблер) Beren42 Помощь студентам 0 15.12.2010 20:32
Найти байтс наибольшим числом единиц и найти байт с наибольшим чилом нулей. Найти разность число единиц м Beren42 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 14.12.2010 17:44
Assembler (массив, разм-ю 9 байт, проверка наличия 3х единиц в коде эл-та) Exelence Помощь студентам 1 05.12.2010 20:05
Дано натуральное число. Верно ли, что в этом числе нет цифры А. А задается с клавиатуры. Женечка92 Помощь студентам 9 03.04.2010 16:06
Не считает сумму между нулями nark25 Общие вопросы C/C++ 6 19.04.2009 19:02