直接操纵汇编中的位以进行位填充

Directly manipulating bits in assembly for bit stuffing

我是汇编新手,想知道有没有什么办法可以直接操作组成某个int值的位来模拟位填充。

例如,如果我有一个 32 位 int 表示我要填充的消息,有没有办法让我在汇编中的那个数字的中间插入一个位?

此外,由于该 int 的大小会变得大于 32,而且我不希望这样,因为寄存器是 32 位的,数字的最后一位将被删除,所以不用担心。

在我使用过的两种流行的指令集架构(x86 和 MIPS)中,没有像您描述的那样将位插入整数中间的机器指令。

但是,该功能可以根据移位、AND、OR、NOT 来实现,这些在所有处理器和所有编程语言(例如 C)上都可用。

示例:在位置 12 插入 5 位:

// 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);