【问题标题】:Why does the MIPS instruction "add" sometimes give me an arithmetic error, but not always?为什么 MIPS 指令“加法”有时会给我一个算术错误,但并非总是如此?
【发布时间】:2015-10-20 13:16:06
【问题描述】:

我最近用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(subtrahend)转化为补码形式,再与RS(minuend)相加?

谢谢!!

【问题讨论】:

    标签: assembly mips add


    【解决方案1】:

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

    它确实溢出无符号,执行最高位,但这与add无关。

    对了,我也想问一下“sub”是怎么工作的?是否会先将RT(subtrahend)转化为补码形式,再与RS(minuend)相加?

    这是一种方法,但可能不是物理实现。更有可能它被实现为a - b = ~(~a + b)a - b = a + ~b + 1,第二个显然直接等同于先求反然后加,但实现将只是一个加法器,它可以带一个进位而不是两个单独的加法器。

    【讨论】:

    • 感谢您的回答,但我仍然对“添加”感到困惑。例如,如果我将 0xfffffff 存储到 $s1 中,那么我不知道 $s1 是指“-1”还是“2^32-1”。这两个值在我使用“add”时会导致不同的结果,对吧?
    • @chengchinlee 当你使用add 时,它意味着只有-1。如果你使用了addu,这将意味着 2^32-1。
    • 我明白了。非常感谢!!
    • 这可能只是语义,但我认为说0xFFFFFFFF 意味着 addaddu 的数字不同是不正确的。据我了解,addaddu 的操作完全相同,除了add 会在溢出时引发异常,而addu 不会。另一方面,比较操作确实区分有符号和无符号:sltsltu
    • @KonradLindenbach 很公平,我只是认为这样更容易理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多