高级语言和机器指令
C程序中涉及的运算
按位运算 数值运算,实现掩码操作
运算时将两个操作数中对应各二进制位按照指定的逻辑运算规则进行计算
“|”:按位OR运算
“&”:按位AND运算
“~”:按位NOT运算
“^”:按位XOR运算
逻辑运算 非数值计算,其操作数只有两个逻辑值:True和False
通常用菲0数表示逻辑值True,用全0数表示逻辑值False
“||”:按位OR运算
“&&”:按位AND运算
“!”:按位NOT运算
####### 移位运算:逻辑移位和算术移位
- 对无符号整数采用逻辑移位,带符号整数采用算术移位
- 逻辑移位——不考虑符号位,把高(低)位移出,低(高)位补0
- 算术移位——左移时,高位移出,低位补0,每移一位,如果移出的高位不同于移位后的符号位,即左移前、后符号位不同,则发生溢出;右移时,低位移出,高位补符号位
- 每左移一位,相当于数值扩大一倍,所以左移可能会溢出,左移k位,相当于数值乘以2k;每右移一位相当于数值缩小一倍,右移k位,相当于数值除以2k
位扩展和位截断运算
- 位扩展运算:数据类型转换时,将一个短数向长数转换
0扩展和符号扩展:0扩展用于无符号数,只要在短的无符号数前面添加足够的0;符号扩展用于补码表示的带符号整数
- 位截断运算:将长数转换为短数
注意截断溢出和截断错误
MIPS指令中涉及的运算
MIPS所有指令都是32位的,操作码占用高6位(bit31-bit26)表示,低26位按格式划分为R型、I型和J型
基本运算部件 加法器、ALU(核心部件是加法器)和移位器
串行进位加法器
全加器:用来实现两个本位数加上低位生成一位本位以及一位向高位的进位
- 加法器执行位串行行操作,利用多个时钟周期完成一次加法运算,即输入操作数和输出结果方式为随时钟串行输入/输出
并行进位加法器
- 用n位全加器实现两个n位操作数各位同时相加,这种加法器称为并行加法器
- 并行加法器中全加器的个数与操作数的位数相同
带标志加法器
- n位无符号数加法器只能用于两个n位二进制数相加,不能进行无符号整数的减运算,也不能进行带符号整数的加/减法
算术逻辑部件
- ALU是一种能进行多种算术运算和逻辑运算的组合逻辑电路,其核心部件是带标志加法器,多采用先行进位方式
定点数运算
补码加减运算
假定了A,B都是正数
- 加法:
整数: [A]补 + [B]补 = [A+B]补 (mod 2^(n+1))
小数: [A]补 + [B]补 = [A+B]补 (mod 2) - 减法:
整数: [A-B]补 = [A]补 + [-B]补 (mod 2^(n+1))
小数: [A-B]补 = [A]补 + [-B]补(mod 2) - [-B]补的求法就是 [B]补的连同符号位在内,每位求反加一
符号位要作为数的一部分一起参加运算,符号位产生的进位要丢掉
逢二进一
参与运算的两个操作数均用补码表示
原码加减运算
- 加法规则:先判断符号位,若相同,则绝对值相加,结果符号位不变;若不同,则做减法,绝对值大的数减去绝对值小的数,结果符号位与绝对值大的数相同
“同号求和,异号求差” - 减法规则:减数符号取反,然后按加法规则进行计算
“异号求和,同号求差”
移码加减运算
- 移码的和、差=和、差的补码
原码乘法运算
原码一位乘法
- 确定乘积的符号位,由两个乘数的符号异或得到
- 计算乘积的数值位,乘积的数值部分分为两个乘数的数值部分之积
原码二位乘法
- 原码两位乘是用两位来决定新的部分积的形成,形成4种状态。
1)乘数为00时,无加操作
2)乘数为01时,+x
3)乘数为10时,+2x(可由x左移一位得到)
4)乘数为11时,可先–x再+4x(x左移两位)
加4x需引入触发器c,c=1时,+4x;初始状态c=0 - 当进行-x运算时,采用+[-|x|]的补码实现,且右移操作按补码右移规则完成(高位补1)
- 如果判断位是11,c=1,且没有下一代时(乘数全部右移完毕),若乘数的位数为偶数位,在乘数前面+00,若乘数的位数为奇数位,则+0即可
- 若乘数位为奇数位,最后需右移一位
补码乘法运算
补码一位乘法
被乘数和部分积均取2位符号位,因此乘数和被乘数均要在最高位扩位。补码扩位原则:正数补0,负数补1.
乘数取一位附加位,作为乘数的最后一位,在移动时作为最低位处理,初始化值为0。
每次都对乘数末两位(包括附加位)判断,数值为00和11时进行右移1位操作,数值为01时部分积+[被乘数]补后进行移位,数值为10时部分积-[被乘数]补后进行移位。
移位次数与乘数数值位的位数有关,但最后一次移位完成后还需要进行步骤3,但不移位。
补码两位乘法
部分积和被乘数采用3位符号位,高位扩位。乘数高位用两位符号位+尾数,末尾加一位附加位,初始值为0
对乘数的末三位判断,情况如下:
000:直接移两位
001:部分积+被乘数的补码后移动两位
010:部分积+被乘数的补码后移动两位
011:部分积+2被乘数的补码(也就是被乘数左移一位的结果)后移动两位
100:部分积-2被乘数的补码(也就是被乘数左移一位的结果)后移动两位
101:部分积-被乘数的补码后移动两位
110:部分积-被乘数的补码后移动两位
111:直接移两位
乘数的尾数分奇数偶数两种情况:偶数时采取两位符号位,奇数时采取一位符号位。偶数情况下:移位次数为尾数位数/2,最后一步仍然要对末三位判断,但是不移位;奇数情况下移位次数为尾数位数/2+1次,最后一步也要对末三位判断,然后移动一位(注意)。
原码除法计算
(1)原码的恢复余数的除法
由于除法通过减法实现,当商上1时,可将比较数据大小的减法操作与除法操作中的减法操作合并,即商上1后继续后面的除法操作。商上0时表明不够减,不应该直接执行除法运算中的减运算,但因试商时的比较操作已经实施了一次减法,因此,需将余数恢复到试商前的值,这可加除数来是想,这种方法称为恢复余数法除法。
例如:x = 0.1001 y=0.1011 求 x/y
(2)原码的不恢复余数的除法
不恢复余数法又称加减交替法,是对恢复余数法的改进,其特点是当试商结果为负时不再恢复余数,而是根据所得余数的符号作下列处理:
- 当余数为正时,商上1,余数左移一位,减去除数;
- 当余数为负时,商上0,余数左移一位,加上除数。
由于没一步都上商,因此运算步数固定,控制简单,提高了运算速度。
补码的不恢复余数的除法:
(1)被除数与除数同号,被除数减去除数;被除数与除数异号,被除数加上除数。
(2)余数与除数同号,商上1,余数左移一位减去除数;余数与除数异号,商上0,余数左移一位加上除数。(注意:余数左移加上或减去除数后就得到了新余数。)
(3)重复(2),直到商的位数满足要求为止。
浮点数运算
浮点数加减运算
- 对阶、尾数运算、规格化、舍入处理、溢出判断
浮点数乘除运算
①阶码运算:阶码求和(乘法)或阶码求差(除法)
即 [Ex+Ey]移= [Ex]移+ [Ey]补
[Ex-Ey]移= [Ex]移+ [-Ey]补
②浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理
例题:X=0 .0110011211,Y=0.11011012-10
求X※Y
解:[X]浮: 0 1 010 1100110
[Y]浮: 0 0 110 1101101
第一步:阶码相加
[Ex+Ey]移=[Ex]移+[Ey]补=1 010+1 110=1 000
1 000为移码表示的0
第二步:原码尾数相乘的结果为:
0 10101101101110
第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。
第四步:舍入处理:按舍入规则,加1进行修正
所以 X※Y= 0.1010111※2+000
运算部件的组成
ALU、移位器、存放临时数据的寄存器,用于数据选择的多路选择器、实现数据传送的总线构成一个运算数据通路