【问题标题】:In MIPS Assembly, how do I truncate to two decimal places if I have a floating point value X.YZDEF in a floating point register?在 MIPS 汇编中,如果浮点寄存器中有浮点值 X.YZDEF,如何截断到小数点后两位?
【发布时间】:2010-04-06 00:04:26
【问题描述】:

如果我在 MIPS 的“f”寄存器中有一个值,我如何将它从 X.YZDEF 截断为 X.YZ?假设您必须将浮点数转换为两个整数并显示它们...这是如何完成的?

【问题讨论】:

    标签: assembly decimal mips truncate


    【解决方案1】:

    您可能想看看这些链接是否对您有帮助。

    http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_Assembly_Language

    http://chortle.ccsu.edu/AssemblyTutorial/index.html#part8

    您可能还会发现这很有帮助: http://www.uni-koblenz.de/~avolk/MIPS/Material/MIPSFloatingPointInstructions.pdf

    很久没做汇编编程了,但是,如果你乘以100 mul.s>,那么你会把这个数字复制到一个整数寄存器,然后如果你除以100 div>那么你将只有右边的两位数。我希望小数点左边的数字是 LO,右边的数字应该是 HI。

    【讨论】:

    • 嗯,有道理,除非你做mul.s,你需要把它放在一个“f”寄存器中。
    • 对,你会做 mul.s,然后将结果复制到整数寄存器,然后进行除法。
    • 啊,我明白了...谢谢,Gunna 尝试一下,然后我会发表评论并告诉你进展如何。谢谢詹姆斯。
    • 你建议我如何复制到 int 寄存器?
    • 啊,我想通了。不过我意识到了一些事情……如果你在计算器上相乘,例如 5.59 x 2.719,我得到 15.2261281。这意味着答案应该是 15.23,四舍五入。当我使用你的方法时,我得到 15.22。有没有办法舍入而不是截断?也许我应该用“round”这个词而不是截断。
    【解决方案2】:

    最简单的做法是:

    1. 将值乘以 100 (mul.d),
    2. 四舍五入为整数,(round.l.d),
    3. 转换回浮点数 (cvt.d.l),然后
    4. 除以 100 (div.d)。

    【讨论】:

      【解决方案3】:

      为了在 MIPS 中实现截断(不是舍入),您可以执行以下操作

      # Note: The number you want to truncate is in $f12
      
      ##### Load 100 #####
      li $t5,100                              # t5 = 100 (word),       t5 (word)
      mtc1 $t5,$f5                            # f5 = t5  (word),       f5 (word)
      cvt.s.w $f5,$f5                         # f5 = wordToSingle(f5), f5 (single)
      
      ##### Multiply f12(single) by 100 (single) #####    
      mul.s $f12,$f12,$f5                     # f12 = f12 (single) * f5 (single), f12 (single)
      
      ##### Truncate single to word #####
      trunc.w.s $f12,$f12                     # f12 = truncWordToSingle(f12 (single)), f12 (word)
      
      ##### Convert from word to single #####
      cvt.s.w $f12,$f12                       # f12 = convertWordToSingle(f12 (word)), f12 (single)
      
      ##### Divide by 100 #####
      div.s $f12,$f12,$f5                     # f12 = f12 (single) / f5 (single), f12 (single)
      

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        相关资源
        最近更新 更多