Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Биты


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

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


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

mov al,array[1]+7

или
Код

mov al,array[1][7]


тока вот я не уверен, что это будет нормально работать...

Автор: Chingachguk 19.5.2005, 00:14
Посмортри главу 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




Автор: WolfON 19.5.2005, 09:44
Все-равно это по производительности почти идентично.....

Мне кажется можно как-=то с памятью поработать или...

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


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

Автор: WolfON 19.5.2005, 21:30
Ну это почти тоже-самое, что у меня smile

Автор: Guest 24.5.2005, 11:46
Ну так, что никто незнает?
Позор....

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

Только без shl и shr - они очень тормознутые.

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

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

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

Автор: WolfON 24.5.2005, 16:24
Нужно проврить бит на соответствие в ергистре или в памяти и выполнить действие.
shl,shr - медленно

Автор: Akina 24.5.2005, 16:39
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
                          .
                          .

Автор: WolfON 24.5.2005, 17:13
Ну тестом я тоже делал, просто вот как достать бит напрямую из памяти, без такого гимора?

Автор: oleg1973 24.5.2005, 22:13
WolfON
Код

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


Автор: AISIN 12.7.2005, 13:18
Цитата(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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)