x86 RCL / RCR指令的实际应用是什么?

GiM*_*GiM 5 x86 assembly bit-manipulation x86-64 bit-shift

我对实际应用感兴趣,即使它们已不符合现代标准。

关于ROL和ROR,这里也有类似的问题,但对于RCL / RCR并没有真正回答。

我可以为RCL,带有操作数1的RCR提出一些应用程序(即,对于某些LFSR),但是我想不出任何带有非1操作数的明智的应用程序

有人能启发我吗?

PS示例代码非常受欢迎。

更新1:如Peter Cordes以下注释中所述,一个(非常明显的)应用程序是shrd / shld。(IIRC rcl / rcr指令已经存在于8080中)

也许上面的“非1”不是很清楚,但是请记住,我对用法最感兴趣,其中操作数是!= 1(RC(L|R) REG, cc等于> 1或== cl)。

Mar*_*nau 5

在移位运算中,这些指令与加法中的加进位 ( adc) 或减进位 ( )指令具有相同的作用sbb

当处理大于 CPU 寄存器最大大小的数字时,它用作第二条指令,因此必须使用多个操作来处​​理该数字。

示例:在 386 CPU 上,您可以使用一条指令执行 32 位操作。但是,您可能想要处理 320 位整数。

假设我们有一个 4 位 CPU,我们想sar对一个 16 位整数执行“算术右移” ( ) 操作:

Integer: ABCDEFGHIJKLMNOP  (A-P = some bits that may be 1 or 0)

Operation on a 16 bit CPU:

    ABCDEFGHIJKLMNOP (SAR 1) -> AABCDEFGHIJKLMNO, CF = P

Operation on a 4 bit CPU:

    ABCD (SAR 1) -> AABC, CF = D
    EFGH, CF = D (RCR 1) -> DEFG, CF = H
    IJKL, CF = H (RCR 1) -> HIJK, CF = L
    MNOP, CF = L (RCR 1) -> LMNO, CF = P

So the final result on the 4-bit CPU is AABCDEFGHIJKLMNO, CF = P
Run Code Online (Sandbox Code Playgroud)

当然,同样的例子也适用于 64 位 CPU 上的 256 位数字......

另请注意:

使用add/adc,sub/sbc或者shl/rcl我们从低位开始并继续高位。但是,使用shr/rcrorsar/rcr则相反。

  • 还值得一提的是,就读取/设置 CF 而言,`adc x,x` 完全等同于 `rcl x, 1`,但速度更快。(`rcl rax,1` 是 Skylake 上的 3 uop 指令,但 `adc rax,rax` 是单 uop https://agner.org/optimize/。Rotate-by-1 设置额外标志,但不是 *all * 标志,所以它解码为一个标志合并 uop。变量计数 `rcl` 更慢,但即使它很快,也不会有很多用例,AFAIK。)所以 `rcl` 只有当你数据在内存中。然而,`rcr` 不能那么容易地被模仿。 (3认同)
  • 有趣的事实:在 AVR(8 位 RISC)上,[`rol` 是 `adc same,same` 的伪指令](https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_ROL.html )。(AVR 旋转总是通过进位。) (3认同)