首页 > 解决方案 > x86 RCL/RCR指令的实际应用是什么?

问题描述

我对实际应用很感兴趣,即使按照现代标准来说它们已经过时了。

这里有类似的问题,关于 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, c其中 c 是 > 1 或 == cl)。

标签: assemblyx86bit-manipulationx86-64bit-shift

解决方案


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

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

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

sar假设我们有一个 4 位 CPU,我们想对一个 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

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

另请注意:

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


推荐阅读