跳转到内容

SPARC 汇编/条件码 & 分支

来自维基教科书,自由的教科书

二进制数系统

[编辑 | 编辑源代码]

二进制(以二为底)系统是计算机用来表示存储在其中的数据的数字系统。与我们习惯的以十为底的系统形成对比,后者使用 0-9 的数字来表示所有可能的实数,而二进制系统仅使用 0-1 的数字。例如,数字 2112 用二进制表示为 100001000000,数字 3 为 11,正如你可能猜到的那样,数字 0 仍然只是 0。

可能看起来以这种方式表示数字只会带来不必要的麻烦和复杂性,从而阻碍了可用性,但实际上并非如此。计算机工程师之所以选择使用这种相对陌生的数字系统,是因为它在使用计算机电路实现和表示时要简单得多,因此与使用更高基数系统相比,创建更复杂的计算机组件要简单得多。

二进制算术

[编辑 | 编辑源代码]

虽然可能看起来并非如此,但二进制数可以像十进制数一样使用。你可以将它们加、减、乘、除、平方等等。目前,可以从 这里 获取更多信息。

二进制补码

[编辑 | 编辑源代码]

虽然在二进制中加两个数字可能很简单,但即使是最小的值的减法也要复杂得多。幸运的是,二进制补码规则允许将二进制减法转换为加法运算,加法运算更容易执行。

以以下例子为例

 ...8421 (value in decimal system)
 ...1001 (9 in binary)

(9-15 in binary)
    1001
    1111 -
    -------
    
    To perform two's complement first you must find the one's complement which
    is simply the NAND (Negated AND) of the number that is being subtracted.
    
    To find the two's complement simply perform binary addition of 1 to the 
    one's complement.
    
                    NAND    1111
    one's complement:       0000
    
                            0000
                                1+
                            -------
     two's complement:      0001
     
(adding the first number and the two's complement)
                            1001
                            0001 +
                            -------
                            1010    
   
    The remainder should be -6, however here we have 10 in decimal, 
    the reason is because the number is a signed value. Here it should represent -6. 
    To confirm the value we have is correct we must perform an additional two's 
    complement on the result.
                            
                            1010
                            0101 
                               1 +
                            -------
                            0110 (6 in decimal)
    This proves that we have -6 as the result of the subtraction.

有符号数和无符号数

[编辑 | 编辑源代码]

条件码

[编辑 | 编辑源代码]

条件码寄存器是条件码寄存器 (CCR) 中包含的特殊标志(位),用于记录有关条件码 (<opcode>cc) 指令的信息,以便程序可以做出分支决策。如上所述,数字是有符号还是无符号的上下文会在它用于计算时隐含非常不同的结果。因此,SPARC 使用不同的 CCR 集来管理有符号和无符号数据。


有符号条件码

[编辑 | 编辑源代码]

对于有符号数,SPARC 使用三个条件码中的三个 - Z、N 和 V 位 - 来调节条件分支


  • Z:此标志跟踪条件码指令的计算结果是否为零。如果结果为零,则将其设置为 1,否则将其设置为 0。例如,
mov 4, %l1         !move 4 into %l1
subcc %l1, 4, %g0  !subtract 4 from %l1
会将 Z 寄存器设置为 1,但
 
mov 4, %l1         !move 4 into %l1
subcc %l1, 3, %g0  !subtract 3 from %l1
会将其设置为零。


  • N:此标志跟踪有符号条件码指令的计算结果是否为负。如果结果为负,则将其设置为 1,否则将其设置为 0。例如,
mov 4, %l1         !move 4 into %l1
subcc %l1, 5, %g0  !subtract 5 from %l1
会将 N 寄存器设置为 1,但
 
mov 4, %l1         !move 4 into %l1
subcc %l1, 3, %g0  !subtract 3 from %l1
会将其设置为零。


  • V:此标志跟踪有符号计算的结果是否太大而无法由 32 位(或可能 64 位)寄存器保存。如果结果太大,则将其设置为 1,否则将其设置为 0。

无符号条件码

[编辑 | 编辑源代码]

分支指令

[编辑 | 编辑源代码]
华夏公益教科书