详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

  汇编语言是依赖于计算机的低级的程序设计语言。

  RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位:

  如果把进位标志位当作操作数最高位的附加位,那么 RCL 就成了循环左移操作。下面的例子中,CLC 指令清除进位标志位。第一条 RCL 指令将 BL 最高位移入进位标志位,其他位都向左移一位。第二条 RCL 指令将进位标志位移入最低位,其他位都向左移一位:

  clc ; CF = 0

  mov bl, 88h ; CF,BL = 0 1000100Ob

  rcl bl, 1 ; CF,BL = 1 00010000b

  rcl b1, 1 ; CF,BL = 0 00100001b

  从进位标志位恢复位

  RCL 可以恢复之前移入进位标志位的位。下面的例子把 testval 的最低位移入进位标志位,并对其进行检查。如果 testval 的最低位为 1,则程序跳转;如果最低位为 0,则用 RCL 将该数恢复为初始值:

  .data

  testval BYTE 01101010b

  .code

  shr testval, 1 ; 将lsb移入进位标志位

  jc exit ; 如果该标志位置 1,则退出

  rcl testval, 1 ; 否则恢复该数原值

  RCR 指令

  RCR(带进位循环右移)指令把每一位都向右移,进位标志位复制到 MSB,而 LSB 复制到进位标志位:

  从上图来看,RCL 指令将该整数转化成了一个 9 位值,进位标志位位于 LSB 的右边。下面的示例代码用 STC 将进位标志位置 1,然后,对 AH 寄存器执行一次带进位循环右移操作:

  stc ; CF = 1

  mov ah, 10h ; AH, CF = 00010000 1

  rcr ah, 1 ; AH, CF = 10001000 0

  有符号数溢出

  如果有符号数循环移动一位生成的结果超过了目的操作数的有符号数范围,则溢出标志位置 1。换句话说,即该数的符号位取反。下例中,8 位寄存器中的正数(+127)循环左移后变为负数(-2):

  mov al, +127 ; AL = 01111111b

  rol al, 1 ; OF = 1, AL = 11111110b

  同样,-128 向右移动一位,溢出标志位置 1。AL 中的结果(+64)符号位与原数相反:

  mov al, -128 ; AL = 10000000b

  shr al, 1 ; OF = 1, AL = 01000000b

  如果循环移动次数大于 1,则溢出标志位无定义。

  总结

  以上所述是小编给大家介绍的汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

  您可能感兴趣的文章: