我正在学习使用emu 8086的8086汇编,我正在玩一些旋转指令,至于我的问题,我知道对于超过1位的移位/旋转,溢出标志OF的行为是未定义的。但当我尝试以下代码时
MOV BH,72H MOV CL,4 ROL BH,CL
结果是BH寄存器中的27 H,至于标志,进位和溢出标志被设置为1,即使OF不应该被设置,因为它是未定义的。谁能解释一下OF是如何以及为什么设置在这里的吗
8i9zcol21#
一个标志为 undefined 意味着它没有被指定是被清除还是被设置。你的模拟器决定设置这个标志。另一个x86 CPU可能会清除这个标志。这个行为甚至可能会根据所使用的操作数而变化,或者每次执行指令时都不一样。不要依赖rol指令后的溢出标志的值。
rol
j1dl9f462#
“undefined”没有值,因此作为单个位,它将是0或1。可能是因为它与执行此指令之前没有变化,也可能是因为它是根据旋转的值设置的,还可能是因为它是完全随机的。此外,根据定义,我们不能依赖于这些情况中的任何一个,所以在这样的操作之后检查值的程序将被认为具有逻辑错误(类似于未初始化的变量)。因此,即使已经测试了rol的每一个可能输入,并得出了关于它 * 在当前特定处理器或模拟器 * 上如何工作的结论,程序仍应注意文档中未定义的内容,而不是期待这种曾经观察到的行为。
2条答案
按热度按时间8i9zcol21#
一个标志为 undefined 意味着它没有被指定是被清除还是被设置。你的模拟器决定设置这个标志。另一个x86 CPU可能会清除这个标志。这个行为甚至可能会根据所使用的操作数而变化,或者每次执行指令时都不一样。不要依赖
rol
指令后的溢出标志的值。j1dl9f462#
“undefined”没有值,因此作为单个位,它将是0或1。
可能是因为它与执行此指令之前没有变化,也可能是因为它是根据旋转的值设置的,还可能是因为它是完全随机的。
此外,根据定义,我们不能依赖于这些情况中的任何一个,所以在这样的操作之后检查值的程序将被认为具有逻辑错误(类似于未初始化的变量)。
因此,即使已经测试了
rol
的每一个可能输入,并得出了关于它 * 在当前特定处理器或模拟器 * 上如何工作的结论,程序仍应注意文档中未定义的内容,而不是期待这种曾经观察到的行为。