【问题标题】:Why would we use addiu instead of addi?为什么我们要使用 addiu 而不是 addi?
【发布时间】:2016-03-29 02:59:14
【问题描述】:

在 MIPS 汇编中,使用 addiu 比使用 addi 有什么好处? addiu 不是没有签名吗(会破坏我们的计算?)

【问题讨论】:

    标签: assembly mips add unsigned immediate-operand


    【解决方案1】:

    会破坏我们的计算

    不,MIPS 使用two's complement,因此相同的加法/减法指令可用于有符号和无符号运算。结果没有区别。

    对于按位指令、非扩展乘法和许多其他操作也是如此。见

    它们之间的唯一区别是addi 在溢出时会生成一个陷阱,而addiu 不会。所以addi 和它的溢出家族(addsub...)通常是没用的。事实上,addi was removed in MIPSr6 很少使用它来释放宝贵的操作码空间给其他指令

    这里的指令名称极具误导性,因为它实际上不是“无符号”加法。立即数仍然是符号扩展,而不是零扩展。所以addiu $1, $2, 0xFFFF 实际上会从$2 中减去 1,而不是加上 65535。

    尽管它的名字,add immediate unsigned (addiu) 用于在我们不关心溢出时向有符号整数添加常量。 MIPS 没有立即数减法指令,负数需要符号扩展,因此 MIPS 架构师决定对立即数字段进行符号扩展。

    Computer Organization and Design: The Hardware/software Interface By David A. Patterson, John L. Hennessy

    阅读更多Difference between add and addu

    【讨论】:

    • 我认为 MIPS 数字是 32 位的,所以 addiu $1, $2, 0xFFFFFFFF 应该从 $2 中减去 1,并且使用 0xFFFF 应该只添加那个数量(只要它明显适合)。还是我错了?
    • @snowflake MIPS 指令是 32 位长的,因此您不能在其中编码 32 位常量。 I 型指令仅包含一个 16 位立即数,在大多数情况下会被符号扩展为 32 位,包括addiu case
    • 这些名称似乎与 C 未定义行为语义相匹配,其中有符号溢出未定义(和 MIPS addi 陷阱),但无符号溢出被定义为包装(addiu 实现)。当然,许多编译器也选择实际为有符号整数实现包装语义,并为所有内容使用addu / addiu。这仍然是一个奇怪的命名约定,但这就是如何记住它们是如何工作的,以及为什么它与如何处理 16 位立即数无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2013-02-18
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多