跳转到内容

数据表示基础:状态寄存器

来自,开放的书籍,开放的世界

单元 1 - ⇑ 数据表示基础 ⇑

← 二进制补码 舍入误差 信息编码方案 →


处理器中的数学运算通常使用固定数量的位进行。例如,当您将 8 位加到 8 位时。这通常不会造成任何问题。

 00110011 (51)
+00001010 (10)
 --------
 00111101 (61)

但是,如果我们将以下数字加在一起会发生什么呢?

 01110011 (115)
+01001010 (74)
 --------
 10111101 (189)

这看起来似乎没问题,但我们有一个问题。如果我们正在处理二进制补码数字,则将两个正数加在一起的结果为负数!

 01110011 (115)
+01001010 (74)
 --------
 10111101 (-67!)

让我们来看看另一个问题示例,溢出的问题

溢出 - 当计算结果过大而无法容纳在设定的位数内时


    1010 (-6)
   +1010 (-6)
    --------
 (1)0100 (+4!)

正如您在上面的总和中看到的那样,我们将两个负数加在一起,结果是一个正数。

为了处理上面提到的情况,我们使用状态寄存器

状态寄存器 - 关于进程状态的信息,例如结果是否为零,正/负或导致溢出。


最常见的标志

[编辑 | 编辑源代码]
标志 名称 描述
Z 零标志 指示算术或逻辑运算(或有时是加载)的结果为零。
C 进位标志 通过根据需要将二进制位从较低有效位字进位到较高有效位字的最低有效位,使比单个字(在上面的示例中为 4 或 8 位)更大的数字能够相加/相减。
S / N 符号标志 / 负标志 一个指示结果是否为负,而另一个指示是否进行了减法或加法。
O 溢出标志 指示操作的带符号结果过大而无法使用二进制补码表示容纳在寄存器宽度中。
P 奇偶校验标志 指示最后结果的设置位数是奇数还是偶数。
状态寄存器工作

对于我们之前遇到的总和,我们将研究如何使用状态寄存器来阻止错误答案的出现

 01110011 (115)
+01001010 (74)
 --------
 10111101 (-67)

状态寄存器:Z = False | C = False | N = True | O = True | P = Even

使用这些标志,您可以看到结果为负数,如果原始总和仅使用正值,那么我们就知道存在错误。

看一下另一个等式

    1010 (-6)
   +1010 (-6)
    ----
 (1)0100

状态寄存器:Z = False | C = True | N = False | O = True | P = Odd

使用这些标志,您可以看到结果为正数,而原始结果使用了两个负数。我们还可以看到发生了溢出。

练习:状态寄存器

以下 4 位总和结果有什么问题?

    1011 (-5)
   +1011 (-5)
    ----

答案

结果会导致溢出,从而给出错误答案

    1011 (-5)
   +1011 (-5)
    ----
 (1)0110 (+6)

在计算的上下文中,溢出是什么?

答案

当计算结果过大而无法容纳在设定的位数内时。

我们为什么需要状态寄存器?

答案

状态寄存器保存标志,跟踪总和的结果,这有助于我们查看结果中是否存在错误并相应地进行更正

列出状态寄存器中的三个标志

答案

溢出、进位、负数、零

显示以下总和的状态寄存器

    1001 (-7)
   +1001 (-7)
    ----
 (1)0010 (+2)

答案

状态寄存器:Z = False | C = True | N = False | O = True | P = Odd

华夏公益教科书