直接操纵汇编中的位以进行位填充
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);
我是汇编新手,想知道有没有什么办法可以直接操作组成某个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);