0

我被要求在硬件上反转位,例如镜像翻转它们,例如 1011 0100 变为 0010 1101,使用移位和旋转组合。我了解这些命令是如何工作的,但我想不出一种方法来翻转它们。谢谢。我需要使用 SAL 汇编语言来完成。

4

1 回答 1

1

如果您需要仅使用移位来翻转 b 位字,则可以模拟堆栈:

b times{
  right shift on the input register, setting a carry flag.
  left shift on the output register, reading the carry flag.
}

请注意,x86 具有“通过进位循环”指令 - 它们用于两个目的(或使用不带进位的输入寄存器的旋转来保留输入)。如果进位左移不可用但进位右移可用,则将前面算法中的单词“left”和“right”颠倒过来。如果没有可用的进位移位,则需要通过“普通”逻辑移位进行模拟,然后设置正确的位,但是......

如果你也可以使用 AND 和 OR 并且 b 是预先知道的并且是 2 的幂,那么有一种更快的方法。反转每对中的两个位,然后在每个半字节内反转两个对,然后在每个字节内反转两个半字节,然后在每个字内反转两个字节......

对于 8 位 x:

                                    //1234 5678
x = (0x55 & x)<< 1 | (0xAA & x)>> 1 //2143 6587
x = (0x33 & x)<< 2 | (0xCC & x)>> 2 //4321 8765
x = (0x0F & x)<< 4 | (0xF0 & x)>> 4 //8765 4321
于 2012-10-27T05:03:53.873 回答