在x86中分别旋转高半字节和低半字节

在x86中分别旋转高半字节和低半字节,x86,byte,X86,Byte,在汇编x86中,我很难找到旋转单个字节半字节的方法。例如,我想旋转高半字节左1,低半字节右1,使0xB4变为0x72。没有汇编指令对此有帮助;你只需要显式地把比特放在你想要的地方 x = (x >> 3 & 0x10) | (x << 1 & 0xe0) | (x << 3 & 0x08) | (x >> 1 & 0x07); x=(x>>3&0x10)|(x1&0x07); 这有时被称为“位组移动”,您可以在汇编

在汇编x86中,我很难找到旋转单个字节半字节的方法。例如,我想旋转高半字节左1,低半字节右1,使0xB4变为0x72。

没有汇编指令对此有帮助;你只需要显式地把比特放在你想要的地方

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

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

x = ((x & 0x70) << 1)
  | ((x & 0x01) << 3)
  | ((x & 0x80) >> 3)
  | ((x & 0x0e) >> 1);
除非通过内存操作数加载巨大的常量,否则它的代码大小要大得多

但所有这些真正要做的就是避免使用256字节的查找表,它更简单,在许多情况下更快(表冷时除外),而且只稍微大一点

mov rdx, 0x0101010101010101
imul rax, rdx ; replicate byte x8 (only 4 are needed but spaced out)
mov rdx, 0x700080000E000100
and rax, rdx  ; isolate the 4 different parts
mov rdx, 0x0008000080002002
imul rax, rdx ; shift/combine parts
shr rax, 56