0

我是汇编新手,我想知道是否有办法让我直接操纵形成某个 int 值的位以模拟位填充。

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

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

4

1 回答 1

3

在我使用过的两种流行的指令集架构(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);
于 2015-05-09T22:24:57.743 回答