Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Биты 
:(
    Опции темы
WolfON
Дата 17.5.2005, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Нужна инфа, как действительно быстро работать с битами на асме, допустим у меня такой код, который я включаю в С++ прогу
Код

mov al,array[1]
shr al,7
xor dl,al


те, я хочу выполнить xor dl со значением 7 бита из 1 записи массива array.
учитывая, что этот код достаточно много повторяется - это сильно влияет на общую производительность программы, хотелось-бы сделать как-нибудь побыстрее...
PM MAIL ICQ   Вверх
Yanis
Дата 17.5.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Ну так это, анализируй её см. свою тему smile

Это сообщение отредактировал(а) Yanis - 17.5.2005, 21:58


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
WolfON
Дата 17.5.2005, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Неет, мне-бы именно какие опкоды для этого дела лучше всего использовать, те какое их сочетание, а то я не шибко их хорошо знаю и таблица тактов мне не слишком поможет smile
Добавлено @ 22:17
Прсосто може есть какие-нибудь не явные способы это сделать допустим что-то вроде:
Код

mov al,array[1]+7

или
Код

mov al,array[1][7]


тока вот я не уверен, что это будет нормально работать...
PM MAIL ICQ   Вверх
Chingachguk
Дата 19.5.2005, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Посмортри главу 2.3.6 из Зубкова СВ по поводу команд bt, bts:

Цитата
2.3.6. Операции над битами и байтами
Команда:
BT база, смещение
Назначение:
Проверка бита
Процессор:
80386

Команда ВТ считывает во флаг CF значение бита из битовой строки, указанной первым операндом, битовой базой (регистр или переменная), со смещением, указанным во втором операнде, битовом смещении (число или регистр). Если первый операнд — регистр, то битовой базой считается бит 0 в указанном регистре и смещение не может превышать 15 или 31 (в зависимости от размера регистра); если оно превышает эти границы, в качестве смещения будет использован остаток от деления его на 16 или 32 соответственно. Если первый операнд — переменная, то в качестве битовой базы используется бит 0 указанного байта в памяти, а смещение может принимать значения от 0 до 31, если оно указано непосредственно (старшие биты процессором игнорируются), и от -231 до 231–1, если оно указано в регистре.


Также хотел заметить, что на быстродействие влияет также спаривание команд и многое другое. Ты привел слишком мало кода, чтобы особо что-то оптимизировать, но вот некоторые принципы:

- не должно идти подряд командам, использующем один и тот же регистр, например:

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






--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
WolfON
Дата 19.5.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Все-равно это по производительности почти идентично.....

Мне кажется можно как-=то с памятью поработать или...
PM MAIL ICQ   Вверх
ZeroMem
Дата 19.5.2005, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



Могу, конечно, ошибаться, но как я понял, тебе надо, допустим, из array[1] скопировать состояние 7-го в dl, а потом выполнить xor c этим элементом? Если так, то я бы действовал вот так(пишу прямо в страницую Могу ошибиться smile ):
mov al, byte ptr array[1]
mov dl, 1
shr dl, 7
and dl, al


Вот вроде где-то так я бы попробовал вытащить состояние 7-го бита. Но если я не ошибаюсь, то это состояние будет не на превом, а на седьмом месте

Это сообщение отредактировал(а) ZeroMem - 19.5.2005, 15:27
PM MAIL ICQ   Вверх
WolfON
Дата 19.5.2005, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Ну это почти тоже-самое, что у меня smile
PM MAIL ICQ   Вверх
Guest
Дата 24.5.2005, 11:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну так, что никто незнает?
Позор....

Переформулирую вопрос:
Как достать бит из памяти?
Как достать бит из регистра?

Только без shl и shr - они очень тормознутые.
  Вверх
Akina
Дата 24.5.2005, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(Guest @ 24.5.2005, 12:46)
Как достать бит из памяти?
Как достать бит из регистра?

AND-ом по соотв. маске. Ясен пень. Или ВТ.

Приведенный фрагмент кода слишком мал, чтобы понять где его можно оптимизировать.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
WolfON
Дата 24.5.2005, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Нужно проврить бит на соответствие в ергистре или в памяти и выполнить действие.
shl,shr - медленно
PM MAIL ICQ   Вверх
Akina
Дата 24.5.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



WolfON
Код

TEST destination,source

          Logic:    (destination AND source)            ; Set flags only

    TEST performs a logical AND on its two operands and updates the flags.
    Neither the destination nor source is changed.

  ===========================================
   Operands                  Clocks   Transfers  Bytes   Example
                           byte(word)
   register, register          3          -        2     TEST SI,DX
   register, memory        9(13) + EA     1       2-4    TEST SI,MASK
   accumulator, immediate      4          -       2-3    TEST AL,00000100b
   register, immediate         5          -       3-4    TEST CX,1234
   memory, immediate        11 + EA       -       3-6    TEST PARAM,1F1Fh
  ===========================================

    TEST is useful for examining the status of individual bits. For
    example, the following section of code will transfer control to
    ONE_FIVE_OFF if both bits one and five of register AL are cleared. The
    status of all other bits will be ignored.

                  TEST    AL,00100010b    ;Mask out all bits except 1 and 5
                  JZ      ONE_FIVE_OFF    ;If either was set, result was not 0
          NOT_BOTH:       .               ;One or both bits was set

          ONE_FIVE_OFF:                   ; Bits 1 and 5 were off
                          .
                          .



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
WolfON
Дата 24.5.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Ну тестом я тоже делал, просто вот как достать бит напрямую из памяти, без такого гимора?
PM MAIL ICQ   Вверх
oleg1973
Дата 24.5.2005, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



WolfON
Код

bt [myvar],7
jc бит_установлен




--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
AISIN
Дата 12.7.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: нет
Всего: 1



Цитата(WolfON @ 17.5.2005, 21:13)
я включаю в С++ прогу



Вот тебе сразу на Си как извлечь бит!
Код

long getbit(char c[],int &n)
 c[]-массив байтов
{

          int bait=n/8; //номер байта
          int bit=n%8; // номер бита в байте
          n++;
         return (c[bait]>>bit)& 1;
}


Это сообщение отредактировал(а) AISIN - 12.7.2005, 13:19
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.