所以我被问到一位朋友的集会问题,他也在努力学习和理解这门语言。他问道:
给出以下寄存器值:
D0: 364B 421E
D1: F3FC 9066
执行指令后:
cmp.w D0,D1
CCR中的结果值是什么:
N: Z: V: C:
以及是否会发生以下每个分支:
BLO <Label> Yes or No?
BVC <Label> Yes or No?
BGE <Label> Yes or No?
BMI <Label> Yes or No?
BLT <Label> Yes or No?
BCS <Label> Yes or No?
当我向他解释时,有人可以帮助我理解它,我可以加深对概念和答案的理解。谢谢。
答案 0 :(得分:4)
将概念映射到现代术语可能会有所帮助。 C标志对应于无符号算术,N和V标志对应于带符号算术。 Z标志对两者都有效。
M68000 Programmer's Reference Manual的表3-19中详细说明了分支指令。请注意,表格中有一些拼写错误。
对于无符号算术,请使用以下分支:
> BHI
<= BLS
>= BCC/BHS
< BCS/BLO
对于带符号算术,请使用以下分支:
>= BGE
< BLT
> BGT
<= BLE
这些都适用于:
== BEQ
!= BNE
最后是BVS / BVC对。当溢出时,V标志置位,这意味着结果的符号位不会跟随输入的符号位。从正数中减去负数应始终产生正数。例如。
答案 1 :(得分:3)
除了溢出和携带之外,大多数都是自我解释但是,根据这个http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt你应该能够解决它们
在二进制/整数数学中打开进位标志的规则是两个:
如果添加两个数字导致进位,则设置进位标志 超出了最重要(最左边)的位。
1111 + 0001 = 0000(进位标志已打开)
如果减去两个数字,也会设置进位(借位)标志 需要借用减去最重要(最左边)的位。
0000 - 0001 = 1111(进位标志已打开)
否则,进位标志关闭(零)。 * 0111 + 0001 = 1000(进位标志关闭[零]) * 1000 - 0001 = 0111(进位标志关闭[零])
在无符号算术中,观察进位标志以检测错误。 在带符号的算术中,进位标志告诉你没什么有趣的。
在二进制/整数数学中打开溢出标志的规则是两个:
如果符号位关闭的两个数字之和产生结果数 符号位打开时,“溢出”标志打开。
0100 + 0100 = 1000(溢出标志已打开)
如果符号位打开的两个数字之和产生结果数 符号位关闭后,“溢出”标志打开。
1000 + 1000 = 0000(溢出标志已打开)
否则,溢出标志被关闭。 * 0100 + 0001 = 0101(溢出标志关闭) * 0110 + 1001 = 1111(溢出标志关闭) * 1000 + 0001 = 1001(溢出标志关闭) * 1100 + 1100 = 1000(溢出标志关闭)
请注意,您只需要查看三者的符号位(最左侧) 确定溢出标志是打开还是关闭的数字。
如果您正在进行二进制补码(带符号)算术,则会打开溢出标志 意味着答案是错误的 - 你添加了两个正数并得到了一个 否定,或者你添加了两个负数并获得了肯定。
如果你正在进行无符号算术,溢出标志就没有意义 应该被忽略。