【问题标题】:Adding two 64 bit numbers in Assembly在汇编中添加两个 64 位数字
【发布时间】:2009-08-15 12:25:32
【问题描述】:

所以我正在使用 SPIM 模拟器学习 MIPS,但我遇到了这个问题。

我想添加两个 64 位数字,它们存储在四个 32 位寄存器中。所以我添加了 LO 字节,然后添加了进位和 HI 字节。但是没有 adc/addc 命令,即带进位相加。

所以我必须在状态寄存器中添加进位位。但是,我该如何读取这个寄存器呢?

如果 $t0 是临时寄存器 1,那么保存进位标志的状态寄存器等价于什么?

我搜索了很多,但仍然找不到任何使用状态寄存器的示例。

【问题讨论】:

  • MIPS 中没有状态或标志寄存器

标签: assembly mips


【解决方案1】:

将 $t2 $t3 + $t4 $t5 相加,得到 $t0 $t1

addu  $t1, $t3, $t5    # add least significant word
sltu  $t0, $t1, $t5    # set carry-in bit 
addu  $t0, $t0, $t2    # add in first most significant word
addu  $t0, $t0, $t4    # add in second most significant word

对于您问题的第二部分,没有状态寄存器。一个都没有。纳达。

【讨论】:

  • 谢谢。为什么我找不到状态寄存器是有道理的:)你的答案很完美。有没有关于更好的 MIPS 编码技巧的地方?
  • 很少。对我来说,冥想其他人的来源或查看 objdump -S 确实有效。您可以从编译器正确执行某些事情的罕见情况中学习,但您可以像往常一样从它们产生完全废话的地方学到更多;-) cs.unibo.it/~solmi/teaching/arch_2002-2003/… 确实也提供了一些有用的提示。
  • 很好的解决方案。当解决明显困难(恕我直言)问题的方法如此优雅时,我喜欢它。
  • 这几乎是确定的方法(如果您想查看两个 64 位数字是否溢出,您仍然可以在四个指令中完成,只需另一个寄存器用于第二个结果,并更改寄存器)。就一个很好的参考而言,参见 Dominic Sweetman 的 MIPS Runs 是我的首选书。如果您不了解通用汇编编程,它虽然不会掌握您的手,但它可以将 MIPS 转换为进出,包括许多特定的芯片变体。
  • 在添加进位 sltu $at, $t1, $t5; addu $t0, $t0, $at 之前执行 addu $t1, $t3, $t5addu $t0, $t2, $t4 可能会更快,因为大多数现代 CPU 都有多个 ALU/FPU,只要它们不是,它们就可以同时运行许多指令相互依赖并依赖以前的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2017-07-27
  • 1970-01-01
相关资源
最近更新 更多