Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > Вставка заданного значения (0 или 1) в любой бит байта со сдвигом влево и ...


Автор: Bartimeus 23.03.18, 17:32
Реализуйте с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом влево и потерей крайнего бита. Как ассемблерная вставка в C++. Помогите пожалуйста

Автор: Славян 23.03.18, 19:17
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int pos=3; // положение бита для вставки
    unsigned char byte=42; // испытуемый
    unsigned char copy=0; // то, что получится при сдвиге
    for( int i=6; i>=pos; i--) // идём со старшего
      copy |= (byte&(1<<i))<<1, // узнали бит, сдвинули, записали на новое место
      byte &= ~(1<<i); // почистили=приготовили место для записи
    if( !нольНадо ) byte |= 1<<pos; // поставили 1
    // иначе - уже там нолик, ибо чистили
    byte |= copy; // допишем голову
    //Готово!
На ASM переведёте, надеюсь! ;)

Автор: Jin X 23.03.18, 19:45
Можно без циклов:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    mov al,[byte]  // если заругается, поменять имя переменной
    mov ah,al
    mov cl,[pos]
    xor edx,edx
    bts edx,ecx
    dec edx
    and al,dl
    not dl
    and ah,dl
    shl ah,1
    or al,ah
    mov ah,[copy]
    shl ah,cl
    or al,ah
    mov [byte],al

Автор: Bartimeus 24.03.18, 15:13
Цитата Jin X @
Можно без циклов:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    mov al,[byte]  // если заругается, поменять имя переменной
    mov ah,al
    mov cl,[pos]
    xor edx,edx
    bts edx,ecx
    dec edx
    and al,dl
    not dl
    and ah,dl
    shl ah,1
    or al,ah
    mov ah,[copy]
    shl ah,cl
    or al,ah
    mov [byte],al

А не можете кратко пояснить что в строках происходит?

Автор: Bartimeus 25.03.18, 07:28
Jin XJin X А можете пояснить что в строчках происходит?

Автор: Jin X 25.03.18, 09:52
Bartimeus, а самому поизучать?
https://www.club155.ru/programming

Вкратце только поясню:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    xor edx,edx
    bts edx,ecx
    dec edx
    and al,dl
Устанавливаем бит номер pos и вычитаем единицу, получаем маску битов младше указанного, применяем её к значению.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    not dl
    and ah,dl
    shl ah,1
    or al,ah
    mov ah,[copy]
    shl ah,cl
    or al,ah
Инвертируем маску, применяем её к старшим битам, затем сдвигаем на 1 влево, объединяем обе части (в середине появляется "дырка").
Берём бит copy, двигаем влево до нужной позиции и объединяем с результатом.

Всё остальное – по ссылке выше.

p.s. Всё сообщение цитировать необязательно...

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