如何使MIPS中的负数为正?

时间:2019-02-20 23:29:36

标签: assembly set mips

基本上是标题。我在MIPS ISA中有一个负数,我想使其为正-实现它的最佳方法是什么?我会改变符号位吗?不能完全确定在这里走哪条路线。

在上下文中,我试图将其除以2以将数字减小到1,但是如果数字为负数是不可能的,所以我想先使其为正数以实现此目的。

1 个答案:

答案 0 :(得分:2)

我想提供一些其他信息(因为 Jester 已经给出了正确的答案):

  

我是否更改符号位或其他内容?

存储负数的方式有多种:

  • 二进制补码
    这是最常见的整数存储方式,因为在大多数CPU(包括MIPS)上,整数运算(例如加法,减法)在使用二进制补码时会自动给出正确的结果。

  • 一个人的补语
    这种存储数字的方式通常用于Internet协议(IPv4,TCP,UDP ...)的校验和计算规则中。

  • 绝对值和符号位
    浮点数通常以这种方式存储。

当然,您需要执行的操作取决于您要处理的数字类型。

  

如何使MIPS中的负数为正数?

  • 负数存储为二进制补码(最有可能用于整数):
    正如 Jester 所写:用0-x计算subu $v0, $zero, $a0

  • 您正在计算Internet的校验和(一个补码):
    在这种情况下,您必须将所有位取反。 MIPS上最好的选择是nor $v0, $zero, $a0
    您可以改为x xor (-1)(-1)-x。在MIPS CPU上,值(-1)可以由一条subiu指令生成。 (但是xori立即使用无符号0..65535。)

  • 您正在通过使用整数指令处理浮点数,并且想要反转符号:
    在这种情况下,您必须更改符号位。
    这是通过x xor 0x80000000完成的。
    在MIPS CPU上,可以使用一条lui指令生成常数0x80000000。

    (如果您的CPU没有浮点支持,则必须执行此操作,并且必须使用整数运算来模拟浮点运算。如果您的CPU具有浮点支持,则通常不会这样做。但是,如果您首先使用mfc1将浮点寄存器复制到整数寄存器,然后在操作之后使用mtc1将值复制回整数,则也可以执行此操作。感谢 @Alain Merigot 作为注释。)

  • 您有一个支持浮点的MIPS CPU或MIPS模拟器,并且想否定一个浮点数:
    您可以使用指令neg.s(32位浮点数)或neg.d(64位浮点数)取反数字。

对于整数输入https://godbolt.org/z/ca2nUE,请查看MIPS GCC对所有这三种方法的作用。