CCR在68000上

时间:2012-11-28 22:30:11

标签: assembly 68000

所以我被问到一位朋友的集会问题,他也在努力学习和理解这门语言。他问道:

给出以下寄存器值:

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?

当我向他解释时,有人可以帮助我理解它,我可以加深对概念和答案的理解。谢谢。

2 个答案:

答案 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)

带有ccr标志的

除了溢出和携带之外,大多数都是自我解释但是,根据这个http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt你应该能够解决它们

携带旗帜

在二进制/整数数学中打开进位标志的规则是两个:

  1. 如果添加两个数字导致进位,则设置进位标志 超出了最重要(最左边)的位。

    1111 + 0001 = 0000(进位标志已打开)

  2. 如果减去两个数字,也会设置进位(借位)标志 需要借用减去最重要(最左边)的位。

    0000 - 0001 = 1111(进位标志已打开)

  3. 否则,进位标志关闭(零)。  * 0111 + 0001 = 1000(进位标志关闭[零])  * 1000 - 0001 = 0111(进位标志关闭[零])

    在无符号算术中,观察进位标志以检测错误。 在带符号的算术中,进位标志告诉你没什么有趣的。

    溢出标志

    在二进制/整数数学中打开溢出标志的规则是两个:

    1. 如果符号位关闭的两个数字之和产生结果数 符号位打开时,“溢出”标志打开。

      0100 + 0100 = 1000(溢出标志已打开)

    2. 如果符号位打开的两个数字之和产生结果数 符号位关闭后,“溢出”标志打开。

      1000 + 1000 = 0000(溢出标志已打开)

    3. 否则,溢出标志被关闭。  * 0100 + 0001 = 0101(溢出标志关闭)  * 0110 + 1001 = 1111(溢出标志关闭)  * 1000 + 0001 = 1001(溢出标志关闭)  * 1100 + 1100 = 1000(溢出标志关闭)

      请注意,您只需要查看三者的符号位(最左侧) 确定溢出标志是打开还是关闭的数字。

      如果您正在进行二进制补码(带符号)算术,则会打开溢出标志 意味着答案是错误的 - 你添加了两个正数并得到了一个 否定,或者你添加了两个负数并获得了肯定。

      如果你正在进行无符号算术,溢出标志就没有意义 应该被忽略。