下面的例子把 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,则溢出标志位无定义。