zl程序教程

您现在的位置是:首页 >  其他

当前栏目

《计算机系统:核心概念及软硬件实现(原书第4版)》——3.3 二进制运算

概念二进制 实现 核心 运算 原书 3.3 计算机系统
2023-09-11 14:19:11 时间

本节书摘来自华章计算机《计算机系统:核心概念及软硬件实现(原书第4版)》一书中的第3章,第3.3节,作者:[美] J. 斯坦利·沃法德(J. Stanley Warford)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 二进制运算

因为计算机中所有信息都是以二进制存储的,所以CPU就用二进制运算来处理这些信息。前面章节提到了NOT、ADD和NEG这些二进制运算:NOT是逻辑运算符,ADD和NEG是算术运算符。本节我们再讲一些其他的在计算机CPU中有用的逻辑和算术运算符。
3.3.1逻辑运算符
我们熟悉逻辑运算AND和OR。另一个逻辑运算符是异或,写作XOR。若p为真,或者q为真,但不同时为真,那么p和q的异或逻辑值为真。即,p一定真异于q,或者q必须真异于p。
二进制数字一个有趣的属性是可以把它们作为逻辑值来解读。在ISA3层,位为1表示真,位为0表示假。图3-15展示了AND、OR和XOR运算符在ISA3层的真值表。
image

在HOL6层,AND和OR对值为真或假的布尔表达式运算,用在if语句和循环中来测试控制语句执行的条件。下面的C++语句是AND运算符的一个例子
image

图3-16是AND、OR和XOR在HOL6层的真值表,它和图3-15是一样的,ISA3层的1对应HOL6层的true(真),ISA3层的0对应HOL6层的false(假)。

image

由于不涉及进位,所以逻辑运算比加法更容易执行。对序列中的对应位进行遂位运算。逻辑运算对进位位和溢出位都没有影响。
例3.19一些6位单元的例子是
image

注意,如果把1与1做AND运算,结果是1,没有进位。 □
每个AND、OR和XOR运算用两组位来产生结果,不过NEG运算仅对一组位进行,因此称为一元运算(unary operation)。
3.3.2寄存器传送语言
寄存器传送语言(RTL)的目的是精确指定硬件操作的结果。如果学习过逻辑学,你会熟悉RTL符号。图3-17展示了RTL符号。


image


在逻辑学中,AND和OR运算称为合取(conjunction)和析取(disjunction),NOT运算符称为否定(negation)。蕴含(implies)运算符可以翻译为英语“if/then”(中文“如果/那么”)。传递(transfer)运算符是与C++中赋值运算符=等效的硬件。运算符左边的内存单元获得运算符右边的量。位索引运算符把内存单元当做数组,最左边的位是索引0,与C++索引数组元素一样。当形式化描述不够时,可以用非形式化的语言描述,用大括号括起来。
有两种分隔符:一个是顺序分隔符(sequential separator)(分号),用来分隔一个接一个发生的两个动作;另一个是并发分隔符(concurrent separator)(逗号)用来分隔同时发生的两个动作。
例3.20在例3.19的第3个计算中,假设第一个6位单元用a表示,第二个6位单元用b表示,结果为c,那么XOR运算的RTL表述是
c←a⊕b; N←c<0, Z←c=0
首先,c获得a和b的异或,这个动作完成后,下面这两个动作同时发生:N获得一个布尔值,Z获得一个布尔值。当c<0时,布尔表达式c<0为1,否则为0。 □
3.3.3算术运算符
另外还有两个一元运算符:ASL表示算术左移(arithmetic shift left)和ASR表示算术右移(arithmetic shift right)。如同ASL这个名字暗示的,单元中每位往左移动一个位置,最左边的位移动到进位位,而最右边的位得到0。图3-18展示了一个6位单元的ASL运算的动作。

image


例3.21下面是3个算术左移的例子。
ASL 11 1100=11 1000, N=1, Z=0, V=0, C=1
ASL 00 0011=00 0110, N=0, Z=0, V=0, C=0
ASL 01 0110=10 1100, N=1, Z=0, V=1, C=0 □
这个运算称为算术移位,因为当这些位用作整数表示时,它的结果类似于算术操作。假设用无符号二进制表示,前面例子中3个整数在移动前是
60 3 22 (dec,unsigned)
移动后成为
56 6 44 (dec,unsigned)
ASL的结果是原数的2倍。因为120超出6位单元能表示的整数范围,所以ASL不能把60翻倍。当把二进制序列看作无符号整数时,如果移动后进位位是1,则发生溢出。
在十进制中,左移产生同样的结果,只是整数被乘以10而不是2。例如,对356进行十进制的ASL会得到3560,它是原数值的10倍。
如果把数解释为补码表示会是什么情况呢?那么移动前3个整数是
-4322(dec,signed)
移动后成为
-86-20(dec,signed)
同样,尽管是负数,ASL的结果仍然是原数的2倍。这次,ASL不能把22翻倍,假定用补码表示,44超出了范围。这个溢出情况使得V位被设置为1。这个情形与加法运算中C位检测到无符号值溢出相似,需要用V位来检测有符号值的溢出。
对6位单元r进行算术左移的RTL表述为
C←r 0 , r 0..4 ←r 1..5 , r 5
N← r 0, Z←r = 0, V←{溢出}
同时,C获得r最左边的位,r最左边的5位直接获得它们紧邻着的右边位的值,最右边一位获得0。移位之后,根据r的新值设置状态位N、Z和V。区分分号和逗号是很重要的:分号隔开两个事件,每个事件有3个部分;在每个部分内,逗号隔开同时发生的事件。大括号非形式化地表示当把值当作有符号整数时,根据结果是否溢出对V位进行设置。
在ASR运算中,组中每个位往右移动一个位置,最低有效位移到进位位,最高有效位保持不变。图3-19展示了一个6位单元的ASR运算的动作。ASR运算不会影响V位。

image


例3.22下面是4个算术右移的例子。
ASR 01 0100=00 1010,N=0, Z=0, C=0
ASR 01 0111=00 1011,N=0, Z=0, C=1
ASR 11 0010=11 1001,N=1, Z=0, C=0
ASR 11 0101=11 1010,N=1, Z=0, C=1 □
ASR运算是特意为补码表示设计的,因为符号位保持不变,负数仍然是负数,正数仍然是正数。
往左移1位是原数乘以2,反之往右移1位是原数除以2。在前面例子中,移动前4个整数为
2023-14-11(dec,signed)
移动后是
1011-7-6(dec,signed)
偶数正好可以被2整除,因此ASR对它们的结果没什么疑问。当奇数除以2时,结果总是向下取整。例如,23÷2=11.5,11.5向下取整为11,同样,-11÷2=-5.5,-5.5向下取整为-6。注意,因为在数轴上-6在-5.5左边,因此它小于-5.5。
3.3.4循环移位运算符
和算术运算符相比,循环移位运算符不会把二进制序列看作整数,因此循环移位运算不会影响N、Z和V位,而只会影响C位。有两种循环移位运算符:表示为ROL的循环左移和表示为ROR循环右移。图3-20展示了6位单元的循环移位运算符的动作。循环左移类似于算术左移,在循环左移中C位会循环移到单元的最右边位,而在算数右移中是0。循环右移是在相反的方向做同样的事情。

image


6位单元循环左移的RTL表述是
C←r〈0〉, r〈0..4〉 ←r〈1..5〉, r〈5〉←c;
例3.23下面是4个循环移位运算的例子。
C=1,ROL 01 1101=11 1011,C=0
C=0,ROL 01 1101=11 1010,C=0
C=1,ROR 01 1101=10 1110,C=1
C=0,ROR 01 1101=00 1110,C=1
左边是循环移位前的C值,而右边是循环移位后的C值。 □


《逻辑与计算机设计基础(原书第5版)》——1.2 计算机系统设计的抽象层次 本节书摘来自华章计算机《逻辑与计算机设计基础(原书第5版)》一书中的第1章,第1.2节,作者:(美)M.莫里斯·马诺(M. Morris Mano)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。