8086/8088 移位指令解释

作者: 爱一直在线 | 来源:发表于2018-01-08 17:27 被阅读29次

    目录

    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

    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

    相关文章

      网友评论

        本文标题:8086/8088 移位指令解释

        本文链接:https://www.haomeiwen.com/subject/dowbnxtx.html