所以我对进位标志的工作原理有点困惑,特别是在 68000 处理器上(但这可能无关紧要)。
我的主要问题如下:
move.b (a0),d0
moveq #7,d1
cmp.b d1,d0
bcc.s DATAErr3
显然,A0 处的字节被复制到 D0,然后 D0 与 7 进行比较。但是,如果设置了进位标志(“bcc”),则有一个到 DATAErr3 的分支。在这个操作中,D0 的什么值会导致进位标志被设置?什么值会导致它不被设置?
谢谢!
d0 >= d1
如果,在无符号比较中, BCC 会分支。d0
在这种情况下,如果大于等于 7,或者为负数,BCC 指令就会跳转。
您可能知道,cmp
实际上是减法,但没有更新目标。对于 68000 汇编语法,destination 总是在右边。因此cmp.b d1,d0
命令从 d0 中存储的字节中减去 d1 中存储的字节,然后丢弃结果,但根据该操作更新标志。
进位标志是根据寄存器中的无符号值设置的。
因此,如果d0.b
包含从 0 到 6 的任何值,则从 0..6 中减去 7 将生成借位并设置进位标志。bcc.s
不会分支。当d0.b
从 7 到 255 时,进位将被清除并bcc.s
分支。
另一种看待bcc
and的方式bcs
是:
blo
=bcs
bhs
=bcc
即bcc
相当于无符号“高于或相同”条件和blo
无符号“低于”