目录
- 非循环移位
1.1 逻辑左移——SHL
1.2 逻辑右移——SHR
1.3 算术左移——SAL
1.4 算术右移——SAR - 循环移位
2.1 循环左移——ROL
2.2 循环右移——ROR
2.3 带进位循环左移——RCL
1.4 带进位循环右移——RCR - 总结
1. 非循环移位
1.1 逻辑左移——SHL
操作数每左移一次,操作数的最低位补零,最高位移入CF(CF的原值丢失)。
例:将 10100101 逻辑左移三次,每次移一位
第一次:01001010 CF=1
第二次:10010100 CF=0
第三次:00101000 CF=1
1.2 逻辑右移——SHR
操作数每右移一次,操作数的最高位补零,最低位移入CF(CF的原值丢失)。
例:将 10101101 右移三次,每次移动一位
第一次:01010110 CF=1
第二次:00101011 CF=0
第三次:00010101 CF=1
1.3 算术左移——SAL
与逻辑左移相同
1.4 算术右移——SAR
每右移一次,操作数的最低位移入CF,最高位(符号位)不变,次高位与最高位相同。
例:将 10000101 算术右移三次,每次一位。
第一次:11000010 CF=1
第二次:11100001 CF=0
第三次:11110000 CF=1
2. 循环移位
2.1 循环左移——ROL
每移位一次,操作数的最高位被移入操作数的最低位,同时(最高位)移入标志位CF。
例:将 10011010 循环左移三次,每次一位。
第一次:00110101 CF=1
第二次:01101010 CF=0
第三次:11010100 CF=0
2.2 循环右移——ROR
每移位一次,操作数的最低位被移入操作数的最高位,同时(最低位)移入标志位CF。
例:将 10011010 循环右移三次,每次一位。
第一次:01001101 CF=0
第二次:10100110 CF=1
第三次:01010011 CF=0
2.3 带进位循环左移——RCL
每移位一次,操作数的最高位移入标志位CF,而原CF中的值移到操作数的最低位。
例:将 10011010 带进位循环左移三次,每次一位。初始CF=0
第一次:00110100 CF=1
第二次:01101001 CF=0
第三次:11010010 CF=0
1.4 带进位循环右移——RCR
每移位一次,操作数的最低位移入标志位CF,而原CF中的值移到操作数的最高位。
例:将 10011010 带进位循环左移三次,每次一位。初始CF=0
第一次:01001101 CF=0
第二次:00100110 CF=1
第三次:10010011 CF=0
总结
- 非循环移位指令,每移一位相当于乘2(左移时)或除2(右移时)。由此可知,无符号数倍增或减半时,使用逻辑左移或右移指令;带符号数要倍增或减半时,可用算术左移或右移指令。只有当移位后的数未超出一字节或一个字(与目的操作数为字节或字相对应)的表达范围,数的倍数和减半才是正确的。
- 循环移位指令,循环移位之后,操作数中原来各数位的信息不会丢失,而是移到了操作数的其他位或进位标志CF中,必要时还可以恢复。
- 当右移一次时,若结果的最高位与次高位不同,则溢出标志位OF=1,否则OF=0;当左移一次时,若结果的最高位与进位标志不相等,则溢出标志位OF=1,否则OF=0。
- 指令格式:移位指令 dst, CL/1