我是汇编新手,我想知道是否有办法让我直接操纵形成某个 int 值的位以模拟位填充。
例如,如果我有一个 32 位 int 表示我想要填充的消息,有没有办法让我在汇编中的那个数字的中间插入一个位?
此外,由于该 int 的大小将大于 32,并且我不希望这样,因为寄存器是 32 位,所以该数字的最后一位将被删除,所以不用担心。
我是汇编新手,我想知道是否有办法让我直接操纵形成某个 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);