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

时间:2019-04-05 21:07:44

标签: assembly x86 bit-manipulation x86-64 bit-shift

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

关于ROL和ROR here,存在类似的问题,但对于RCL / RCR并没有真正的答案。

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

那么有人能启发我吗?

P.S。示例代码非常受欢迎。

更新1 :如以下评论中提到的Peter Cordes一样,一个(很明显)的应用程序是shrd / shld。 (IIRC rcl / rcr指令已经存在于8080中)

上面的“非1”可能不清楚,但是请记住,我对使用最感兴趣,其中操作数为!= 1(RC(L|R) REG, c,其中c为> 1或== cl )。

1 个答案:

答案 0 :(得分:4)

在换档操作中,这些指令除具有以下功能外,还与进位加法(adc)或进位减法(sbb)相同:

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

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

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

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/adcsub/sbcshl/rcl,我们从低位开始,然后从高位开始。但是,使用shr/rcrsar/rcr则相反。