assembly 在ROL操作后将溢出标志设置为1,尽管它应该是未定义的

zbdgwd5y  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(120)

我正在学习使用emu 8086的8086汇编,我正在玩一些旋转指令,至于我的问题,我知道对于超过1位的移位/旋转,溢出标志OF的行为是未定义的。
但当我尝试以下代码时

MOV BH,72H

MOV CL,4

ROL BH,CL

结果是BH寄存器中的27 H,至于标志,进位和溢出标志被设置为1,即使OF不应该被设置,因为它是未定义的。
谁能解释一下OF是如何以及为什么设置在这里的吗

8i9zcol2

8i9zcol21#

一个标志为 undefined 意味着它没有被指定是被清除还是被设置。你的模拟器决定设置这个标志。另一个x86 CPU可能会清除这个标志。这个行为甚至可能会根据所使用的操作数而变化,或者每次执行指令时都不一样。不要依赖rol指令后的溢出标志的值。

j1dl9f46

j1dl9f462#

“undefined”没有值,因此作为单个位,它将是0或1。
可能是因为它与执行此指令之前没有变化,也可能是因为它是根据旋转的值设置的,还可能是因为它是完全随机的。
此外,根据定义,我们不能依赖于这些情况中的任何一个,所以在这样的操作之后检查值的程序将被认为具有逻辑错误(类似于未初始化的变量)。
因此,即使已经测试了rol的每一个可能输入,并得出了关于它 * 在当前特定处理器或模拟器 * 上如何工作的结论,程序仍应注意文档中未定义的内容,而不是期待这种曾经观察到的行为。

相关问题