为什么MIPS指令"添加"有时给我一个算术错误,但并不总是?

时间:2015-10-20 13:16:06

标签: assembly mips add

我最近使用MARS4.5练习为MIPS编写汇编语言,但我遇到了一些问题。

第一个代码是:

addi $s0,$s0,8 #s0 = 0x00000008
sll $s0,$s0,28 #s0 = 0x80000000
addi $s1,$s1,13#s1 = 0x0000000D
sll,$s1,$s1,28 #s1 = 0xD0000000
add $t0,$s0,$s1 #t0 =0xD0000000 + 0x80000000

我将得到算术错误

第二个代码是:

addi $s0,$s0,-1 #s0 = 0xffffffff
addi $s1,$s1,2  #s1 = 0x00000002
add $t0,$s0,$s1 #t0 =0xffffffff + 0x00000002

我将得到结果0x00000001

两个代码都会遇到溢出,为什么我没有在第二个代码中得到错误?

顺便说一句,我也想问一下" sub"作品? 它是否会首先将RT(减数字)转换为两个补码的形式并将其与RS(minuend)相加?

谢谢!!

1 个答案:

答案 0 :(得分:1)

添加带有不同符号的数字永远不会有符号溢出。那里有-1 + 2,问题是什么?

它确实溢出无符号,执行顶部位,但这与a - b = ~(~a + b)无关。

  

顺便说一句,我也想问一下" sub"作品?它是否会首先将RT(减数字)转换为两个补码的形式并将其与RS(minuend)相加?

这是一种方法,但可能不是物理实现。它更有可能被实现为a - b = a + ~b + 1:valid,第二个显然直接等同于否定然后添加,但实现只是一个可以接受进位的加法器两个单独的加法器。