3.2加法与减法
精解,MIPS指令中有符号数溢出和无符号数溢出指令
有符号数
addu $to,$t1,$t2
xor $t3,$t1,$t2 #首先两个数进行异或操作,核心是看做高位也就是符号位
slt $t3,$t3,$zero #如果最高位是1,按照有符号数判断则小于0,$t3得到1这个值,证明两个数符号不一样
bne $t3,$zero,no overflow #不等则不溢出,接下来需要去判断如果符号位相等怎么办,符号为相等则异或后最高位是0(符号位),那么比较就会大于0,只需要比较和和两个相同符号加数的符号是否一致就可以了,一致没有溢出,不一致溢出
xor $t3,$t3,$t1 #如果不一样,最高位是1,就会小于0,则溢出
slt $t3,$t3,$zero
bne $t3,$zero,overflow
无符号数,相较于有符号数,还是简单的多,只需要判断两个数是不是大于2的n次方减1
addu $t0,$t1,$t2 #其实这句没用上
nor $t3,$t1,$zero #求t1的非,根据2' comp 就是2的补码可以表示称为2e32-t1-1,接下来只需要判断这个非,如果大于t2则没溢出,如果小于t2则溢出,即t1+t2>2e32-1
sltu $t3,$t3,$t2 #如果小于t2,则t3为1
bne $t3,$zero,overflow
MIPS使用名为异常程序计数器(Exception Program Counter,EPC)的寄存器来保存导致异常的指令地址。
3.3乘法
mflo,mfhi指令将积送入指定的寄存器
更快速的乘法,这个低位我能看懂但是高位不太能看懂,感觉直接最高两位相乘相加有问题。