Непосредственное манипулирование битами в сборке для битовой начинки

Я новичок в сборке, и мне было интересно, был ли у меня способ напрямую манипулировать битами, которые формируют определенное значение типа 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);
Другие вопросы по тегам