8086汇编:移位与旋转指令对溢出标志位的影响规则咨询
8086汇编移位与旋转指令的溢出标志(OF)判定规则
一、移位指令(SHL/SAL/SHR/SAR)的OF规则
移位指令的OF仅在移位次数为1时有明确判定逻辑,若移位次数>1,OF的值为无定义(可呈现任意值,不遵循符号位变化规则):
- SHL/SAL(逻辑/算术左移):OF = 移位前操作数的最高位(符号位)与移位后的最高位的异或结果。即左移1次后符号位发生变化(0变1或1变0),OF置1;否则置0。
- SHR(逻辑右移):OF = 移位前操作数的最高位。因为逻辑右移最高位补0,若原符号位为1,移位后符号位变为0,OF置1;原符号位为0则OF置0。
- SAR(算术右移):OF恒为0。因为算术右移最高位始终补原符号位,移位前后符号位不变。
二、旋转指令(ROL/ROR/RCL/RCR)的OF规则
旋转指令的OF同样仅在旋转次数为1时有明确规则,次数>1时OF无定义:
- ROL(循环左移):OF = 操作数原最高位与原次高位的异或结果。左移1次后,原次高位成为新的最高位,若原最高位与次高位不同,说明符号位发生变化,OF置1;否则置0。
- ROR(循环右移):OF = 操作数原最高位与原最低位的异或结果。右移1次后,原最低位成为新的最高位,若原最高位与最低位不同,符号位变化,OF置1;否则置0。
- RCL(带进位循环左移):OF = 操作数原最高位与移位前CF值的异或结果。左移1次后,原CF值成为操作数的新最高位,若原最高位与CF不同,符号位变化,OF置1;否则置0。
- RCR(带进位循环右移):OF = 操作数原最高位与移位前CF值的异或结果。右移1次后,原CF值成为操作数的新最高位,若原最高位与CF不同,符号位变化,OF置1;否则置0。
针对你的示例与困惑的解释
- 你给出的代码:
MOV AX,6EH MOV CL,2 SHL AL,CL
由于移位次数为2(>1),此时OF的值是无定义的,无论移位前后符号位是否变化,OF都可能被置1或0,这是符合8086指令规范的。
- 关于“最后一次旋转时符号位未改变,OF却被置1”的情况:
当旋转次数>1时,OF的值是无定义的,不遵循“符号位变化则置1”的规则。即使最后一次旋转后符号位没变化,OF仍可能呈现1,这是正常现象,因为此时OF的值没有固定判定逻辑。
内容的提问来源于stack exchange,提问作者rayyya
相关产品推荐
相关产品推荐

