加法和减法
减法可以采用的操作:
1.直接减
2.加上被减数的补码
考虑可能发生溢出的几种情况
1.两个符号相同的数相加
2.两个符号相反的数相减
(用正数减负数得到负数的结果 或者 是用负数减正数得到正数的结果)
------>MIPS检测溢出的方法:
采用两种算数指令
加法(add)立即数加法(addi)和减法(sub)在溢出时产生异常
无符号加法(addu)立即数无符号减法(addiu)和无符号减法(subu)在溢出时不会产生异常
在这里就要想到符号拓展了:
在MIPS语言中,许多指令规定立即数是16位的,例如addi,对于addiu来说,与add,addi和sub指令类似,16位立即数要拓展为32位
乘法
对于正数:通过乘数不断地右移一位,被乘数不断地左移一位,然后将所得乘积全部相加
有符号乘法:将被乘数与乘数化为正数(采用补码的形式)并记住原来的符号位,迭代31次,当符号位相异时,结果为负
MIPS单独提供了一堆32位寄存器来容纳64位的积,称为Hi和Lo
为了产生正确的有符号积和无符号积,MIPS提供了两条指令:
乘法(mult)和无符号乘法(multu)
MIPS乘法指令都忽略溢出------->利用软件来检测是否因积过大而32位不够表示-------->
对于multu,如果Hi为0则无溢出,对于mult,如果Hi为Lo的符号位则也无溢出
除法
除法比乘法要稍微复杂一点,首先要确定商寄存器的位数,例如是4位的,则需要将除数向左移四位,然后比较移完的除数与被除数的关系,用被除数减去除数,若结果>0,则商低位为一,将商左移一位,除数右移一位,被除数减除数,继续比较,否则为0,商低位为0,将商左移一位,除数右移一位,继续比较。
有符号除法
记住除数和被除数的符号位,相异,则商为负
有符号数(div)无符号数(divu),寄存器与乘法相同
浮点运算
利用32比特的字长表示浮点数
符号位置于最高位,指数位放在有效位前(有着相同符号的情况下,指数大的其数值就越大),尾数宽度影响表示范围(字的大小是固定的,尾数和指数的位宽需要折中掂量)
MIPS单精度浮点数:指数域8位,尾数域23位,符号1位
IEEE 754浮点标准-隐藏规格化二进制数的前导位1(去除了1,只保留小数点后的几位)
-引入带偏阶的计数法(将最小的负指数表示为00...000,最大的正整数表示为11...111)
可能导致的问题:
上溢:正的指数太大而导致指数域放不下
下溢:付的指数太大而导致指数域放不下
------->双精度浮点数:指数域11位,尾数域52位,符号1位