2

我只是想在本机 MIPS 上实现多精度算术。假设一个 64 位整数在寄存器 $12 和 $13 中,另一个在寄存器 $14 和 $15 中。这笔款项将存放在 10 美元和 11 美元的寄存器中。64 位整数的最高有效字在偶数寄存器中找到,最低有效字在奇数寄存器中找到。它说,在互联网上,这是最短的实现。

addu  $11, $13, $15    # add least significant word
sltu  $10, $11, $15    # set carry-in bit 
addu  $10, $10, $12    # add in first most significant word
addu  $10, $10, $14    # add in second most significant word

我只是想仔细检查我是否理解正确。sltu 检查两个最低有效字的总和是否小于或等于操作数之一。如果是这种情况,那么是否发生了进位,这是对的吗?

要检查添加两个最重要的单词时是否发生进位并将结果存储在 $9 我必须做的事情:

sltu  $9, $10, $12    # set carry-in bit 

这有道理吗?

4

1 回答 1

1

sltu 检查两个最低有效字的总和是否小于或等于操作数之一。

不完全:$10如果两个最低有效字的总和严格小于操作数之一(被视为 32 位无符号值),则它设置为 1;如果总和等于或大于该操作数,则为 0。

如果是这种情况,那么是否发生了进位,这是对的吗?

是的。

考虑将b的各种可能值添加到某个特定值a时会发生什么(其中一切都是无符号的 32 位值):

  • 如果没有发生溢出,我们必须有一个<= sum <= 0xFFFFFFFF,所以 0 <= b <= (0xFFFFFFFF - a )。
  • b的其余情况导致溢出;在这些情况下,实际总和必须是 0x100000000 <= sum <= a + 0xFFFFFFFF,当截断为 32 位时,得出 0 <= sum <= a - 1。

要检查添加两个最重要的单词时是否发生进位并将结果存储在 $9 我必须做的事情:

sltu $9, $10, $12 # set carry-in bit

不完全的。

这里的问题是您要添加两个 32 位值,并且可能会从最低有效字的总和中添加一个进位。例如,考虑存在进位且两个最高有效字均为 0xFFFFFFFF 的情况:总和将为 1+ 0xFFFFFFFF + 0xFFFFFFFF = 0xFFFFFFFF,因此不会设置进位(但应该设置)。

解决此问题的一种方法是在添加$12到后检查进位$10,并在添加$11到该总和后再次检查。这些和中只有一个可以产生进位(仅在0xFFFFFFFF$12 + $10时溢出,因为是 0 或 1;在这种情况下,和为 0,因此第二个和也不会溢出)。$12$10

因此,这可能(免责声明:为时已晚,并且未经测试)可以解决问题:

addu $11, $13, $15
sltu $10, $11, $15  # carry from low word
addu $10, $10, $12
sltu  $9, $10, $12  # possible carry from high word (1)
addu $10, $10, $14
sltu  $8, $10, $14  # possible carry from high word (2)
or    $9,  $8,  $9  # carry in result if either (1) or (2) were true (can't both be true at once)
于 2010-04-21T23:22:26.523 回答