| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Биты |
| Автор: WolfON 17.5.2005, 21:13 | ||
Нужна инфа, как действительно быстро работать с битами на асме, допустим у меня такой код, который я включаю в С++ прогу
те, я хочу выполнить xor dl со значением 7 бита из 1 записи массива array. учитывая, что этот код достаточно много повторяется - это сильно влияет на общую производительность программы, хотелось-бы сделать как-нибудь побыстрее... |
| Автор: Yanis 17.5.2005, 21:57 |
| Ну так это, анализируй её см. http://forum.vingrad.ru/index.php?showtopic=52411 |
| Автор: WolfON 17.5.2005, 22:15 | ||||
| Неет, мне-бы именно какие опкоды для этого дела лучше всего использовать, те какое их сочетание, а то я не шибко их хорошо знаю и таблица тактов мне не слишком поможет Добавлено @ 22:17 Прсосто може есть какие-нибудь не явные способы это сделать допустим что-то вроде:
или
тока вот я не уверен, что это будет нормально работать... |
| Автор: Chingachguk 19.5.2005, 00:14 | ||
Посмортри главу 2.3.6 из Зубкова СВ по поводу команд bt, bts:
Также хотел заметить, что на быстродействие влияет также спаривание команд и многое другое. Ты привел слишком мало кода, чтобы особо что-то оптимизировать, но вот некоторые принципы: - не должно идти подряд командам, использующем один и тот же регистр, например: mov eax,[esi] xor edx,eax ; use eax inc ecx Лучше менять на: mov eax,[esi] inc ecx xor edx,eax Насчет прямо приведенного тобой кода можно порекомендовать: заранее хранить перевернутые байты в array, чтобы не делать shr al,7; или сделать то же самое в несколько команд: mov al,array[1] rol al,1 and al,1 xor dl,al |
| Автор: WolfON 19.5.2005, 09:44 |
| Все-равно это по производительности почти идентично..... Мне кажется можно как-=то с памятью поработать или... |
| Автор: ZeroMem 19.5.2005, 15:26 |
| Могу, конечно, ошибаться, но как я понял, тебе надо, допустим, из array[1] скопировать состояние 7-го в dl, а потом выполнить xor c этим элементом? Если так, то я бы действовал вот так(пишу прямо в страницую Могу ошибиться mov al, byte ptr array[1] mov dl, 1 shr dl, 7 and dl, al Вот вроде где-то так я бы попробовал вытащить состояние 7-го бита. Но если я не ошибаюсь, то это состояние будет не на превом, а на седьмом месте |
| Автор: WolfON 19.5.2005, 21:30 |
| Ну это почти тоже-самое, что у меня |
| Автор: Guest 24.5.2005, 11:46 |
| Ну так, что никто незнает? Позор.... Переформулирую вопрос: Как достать бит из памяти? Как достать бит из регистра? Только без shl и shr - они очень тормознутые. |
| Автор: Akina 24.5.2005, 11:58 | ||
AND-ом по соотв. маске. Ясен пень. Или ВТ. Приведенный фрагмент кода слишком мал, чтобы понять где его можно оптимизировать. |
| Автор: WolfON 24.5.2005, 16:24 |
| Нужно проврить бит на соответствие в ергистре или в памяти и выполнить действие. shl,shr - медленно |
| Автор: Akina 24.5.2005, 16:39 | ||
WolfON
|
| Автор: WolfON 24.5.2005, 17:13 |
| Ну тестом я тоже делал, просто вот как достать бит напрямую из памяти, без такого гимора? |
| Автор: oleg1973 24.5.2005, 22:13 | ||
WolfON
|
| Автор: AISIN 12.7.2005, 13:18 | ||||
Вот тебе сразу на Си как извлечь бит!
|