2

所以我被一个朋友问了一个汇编问题,他也在努力学习和理解这门语言。他问:

给定以下寄存器值:

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?

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

4

2 回答 2

4

将这些概念映射到现代术语可能会有所帮助。C 标志对应于无符号算术,N 和 V 标志对应于有符号算术。Z 标志对两者都有效。

分支指令在M68000 程序员参考手册的表 3-19 中有完整的说明。请注意,表格中有几个错别字。

对于无符号算术,使用以下分支:

>   BHI
<=  BLS
>=  BCC/BHS
<   BCS/BLO

对于有符号算术,请使用以下分支:

>=  BGE
<   BLT
>   BGT
<=  BLE

这些对两者都有效:

==  BEQ
!=  BNE

最后是 BVS/BVC 对。溢出时设置 V 标志,这意味着结果的符号位不跟随输入的符号位。例如,从正数中减去负数应始终得到正数。

于 2012-11-28T23:49:52.983 回答
3

除了溢出和进位之外,ccr 标志大多数都是自我解释的,但是根据这个http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt你应该能够弄清楚它们

携带标志

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

  1. 如果两个数字相加导致添加的最高有效(最左边)位进位,则设置进位标志。

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

  2. 如果两个数字的减法需要借位到减去的最高有效位(最左边),则也设置进位(借位)标志。

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

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

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

溢出标志

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

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

    0100 + 0100 = 1000(溢出标志开启)

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

    1000 + 1000 = 0000(溢出标志开启)

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

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

如果您正在执行二进制补码(有符号)算术,溢出标志表示答案错误 - 您添加了两个正数并得到了一个负数,或者您添加了两个负数并得到了一个正数。

如果你在做无符号算术,溢出标志没有任何意义,应该被忽略。

于 2012-11-29T10:51:33.467 回答