Непосредственное манипулирование битами в сборке для битовой начинки
Я новичок в сборке, и мне было интересно, был ли у меня способ напрямую манипулировать битами, которые формируют определенное значение типа int, чтобы имитировать вставку битов.
Например, если у меня 32-разрядное целое число, представляющее сообщение, которое я хочу заполнить, есть ли способ вставить немного в середину этого числа в сборке?
Кроме того, поскольку размер этого int станет больше 32, и я не хочу, чтобы, поскольку регистры были 32-битными, последние биты числа будут просто удалены, так что об этом не стоит беспокоиться.
1 ответ
Среди двух популярных архитектур набора команд, с которыми я работал (x86 и MIPS), нет машинных инструкций для вставки битов в середину целого числа, как вы описали.
Однако функциональность может быть реализована в виде побитовых сдвигов, И, ИЛИ, НЕ, которые доступны на всех процессорах и на всех языках программирования (таких как C).
Пример: вставка 5 битов в позицию 12:
// Inputs given
uint32 original = (...); // [xxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyy]
uint32 insert = (...); // [000000000000000000000000000zzzzz]
// Computation
uint32 mask = (1 << 12) - 1; // [00000000000000000000111111111111]
uint32 a = original & mask; // [00000000000000000000yyyyyyyyyyyy]
uint32 b = original & ~mask; // [xxxxxxxxxxxxxxxxxxxx000000000000]
uint32 c = b << 5; // [xxxxxxxxxxxxxxx00000000000000000]
uint32 d = b | c; // [xxxxxxxxxxxxxxx00000yyyyyyyyyyyy]
uint32 e = insert << 12; // [000000000000000zzzzz000000000000]
uint32 result = d | e; // [xxxxxxxxxxxxxxxzzzzzyyyyyyyyyyyy]
// All together compactly
uint32 result = (original & mask) | ((original & ~mask) << 5) | (insert << 12);