当前位置: 代码迷 >> 综合 >> 8086/8088移位指令
  详细解决方案

8086/8088移位指令

热度:58   发布时间:2023-10-23 21:51:32.0

目录

  1. 非循环移位
    1.1 逻辑左移——SHL
    1.2 逻辑右移——SHR
    1.3 算术左移——SAL
    1.4 算术右移——SAR
  2. 循环移位
    2.1 循环左移——ROL
    2.2 循环右移——ROR
    2.3 带进位循环左移——RCL
    1.4 带进位循环右移——RCR
  3. 总结

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<%?Fp>

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

总结

  1. 非循环移位指令,每移一位相当于乘2(左移时)或除2(右移时)。由此可知,无符号数倍增或减半时,使用逻辑左移或右移指令;带符号数要倍增或减半时,可用算术左移或右移指令。只有当移位后的数未超出一字节或一个字(与目的操作数为字节或字相对应)的表达范围,数的倍数和减半才是正确的。
  2. 循环移位指令,循环移位之后,操作数中原来各数位的信息不会丢失,而是移到了操作数的其他位或进位标志CF中,必要时还可以恢复。
  3. 当右移一次时,若结果的最高位与次高位不同,则溢出标志位OF=1,否则OF=0;当左移一次时,若结果的最高位与进位标志不相等,则溢出标志位OF=1,否则OF=0。
  4. 指令格式:移位指令 dst, CL/1