我最近使用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)相加?
谢谢!!
答案 0 :(得分:1)
添加带有不同符号的数字永远不会有符号溢出。那里有-1 + 2,问题是什么?
它确实溢出无符号,执行顶部位,但这与a - b = ~(~a + b)
无关。
顺便说一句,我也想问一下" sub"作品?它是否会首先将RT(减数字)转换为两个补码的形式并将其与RS(minuend)相加?
这是一种方法,但可能不是物理实现。它更有可能被实现为a - b = a + ~b + 1
或:valid
,第二个显然直接等同于否定然后添加,但实现只是一个可以接受进位的加法器两个单独的加法器。