我被要求在HW上反转位,例如镜像翻转它们,例如1011 0100变为0010 1101,使用移位和旋转组合。我理解这些命令是如何工作的,但我想不出一种方法来翻转它们。谢谢。 我需要使用SAL汇编语言来完成它。
答案 0 :(得分: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"和"对"在以前的算法中。如果没有可用的转移,您需要通过"普通"模拟。逻辑移位后设置正确的位,但是......
如果你也可以使用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