Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Assembler > Вставка заданного значения (0 или 1) в любой бит байта со сдвигом влево и ... |
Автор: Bartimeus 23.03.18, 17:32 |
Реализуйте с помощью логических операций вставку заданного значения (0 или 1) в любой бит байта со сдвигом влево и потерей крайнего бита. Как ассемблерная вставка в C++. Помогите пожалуйста |
Автор: Славян 23.03.18, 19:17 |
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> На ASM переведёте, надеюсь! 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; // допишем голову //Готово! |
Автор: 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}> Устанавливаем бит номер pos и вычитаем единицу, получаем маску битов младше указанного, применяем её к значению.xor edx,edx bts edx,ecx dec edx and al,dl <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Инвертируем маску, применяем её к старшим битам, затем сдвигаем на 1 влево, объединяем обе части (в середине появляется "дырка").not dl and ah,dl shl ah,1 or al,ah mov ah,[copy] shl ah,cl or al,ah Берём бит copy, двигаем влево до нужной позиции и объединяем с результатом. Всё остальное – по ссылке выше. p.s. Всё сообщение цитировать необязательно... |