在x86

时间:2018-04-04 16:35:50

标签: x86 byte

我无法找到在程序集x86中旋转一个字节的单个半字节的方法。例如,我想将hi半字节旋转为左1,并且低半字节右旋1,使0xB4变为0x72。

2 个答案:

答案 0 :(得分:1)

这有时被称为“位组移动”,您可以在汇编中实现:

0.10

它基本上是一种蛮力的方式来实现排列,同时移动具有相同移位计数/方向的每个“组”位。它往往有点冗长。

8位排列的一个有趣的策略是“通过乘法置换”,遗憾的是它涉及一些巨大的常数:

x = ((x & 0x70) << 1)
  | ((x & 0x01) << 3)
  | ((x & 0x80) >> 3)
  | ((x & 0x0e) >> 1);

除非通过内存操作数加载大量常量,否则代码大小要大得多。

但所有这一切确实在做的是避免使用256字节的查找表,这样更简单,在许多情况下更快(除非表格很冷)并且只是略大一些。

答案 1 :(得分:0)

没有汇编指令可以帮助解决这个问题。你只需要明确地将这些位放在你想要的位置。

x = (x >> 3 & 0x10) | (x << 1 & 0xe0) | (x << 3 & 0x08) | (x >> 1 & 0x07);