如何使用MIPS执行64位加法和减法?

Met*_*ite 3 assembly mips mips32

我想执行64位加法和减法:

v1v0(HiLo) = a1a0 + a3a2使用MIPS汇编语言(a1a0(HiLo)第一个64位数字由两个32位数字组成,a3a2(HiLo)是第二个)

我有:

$a0 = 0xffffffff
$a1 = 0x0
$a2 = 0x1
$a3 = 0x0
Run Code Online (Sandbox Code Playgroud)

我是MIPS的初学者,我不知道如何处理携带.有人可以提供解释解决方案吗?

提前致谢!这是我正在使用的指令集:

http://www.cs.uregina.ca/Links/class-info/201/SPIM-IO/MIPSrefCard.pdf

Ama*_*eus 5

要减去一个数字,即v = a - b与使用负数进行添加相同,即v = a + (-b).但是,在整数aritmetic中,负数被编码为2-compliment,这与1-compliment + 1相同,而1-compliment是按位否定.

通过这种方式,我们可以写出:

v1v0 = a1a0 - b1b0
v1v0 = a1a0 + ~b1~b0 + 1
Run Code Online (Sandbox Code Playgroud)

所以,我们可以在汇编中写这个(假设b1 = a3和b0 = a2):

add64: addu  $v0, $a0, $a2    # add least significant word
       nor   $t0, $a2, $zero  # ~a2
       sltu  $t0, $a0, $t0    # set carry-in bit (capturing overflow)
       addu  $v1, $t0, $a1    # add in first most significant word
       addu  $v1, $v1, $a3    # add in second most significant word
       jr $ra
#PS: To capture the carry bit in a unsigned sum is equivalent to test if the sum
# can not be contained in a 32 bit register. I.e. if a0 + a2 > 2^32 - 1

sub64: nor $a3, $a3, $zero    # ~b1
       nor $a2, $a2, $zero    # ~b0
       jal add64    # v1v0 = a1a0 + ~b1~b0
         # adding 1 to v1v0
       ori $a0, $v0, 0
       ori $a1, $v1, 0
       ori $a2, $zero, 1
       ori $a3, $zero, 0
       jal add64
       jr $ra
Run Code Online (Sandbox Code Playgroud)

使用你的想法,我想你会回答你自己的问题:

subu $v0, $a0, $a2 # $v0 = $a0 - $a2 
sltu $v1, $a0, $a2 # $v1 = ($a0 < $a2)? 1:0(subtract 1 if there's a borrow for Lo words) 
subu $a1, $a1, $v1 # $a1 = $a1 - $v1 
subu $v1, $a1, $a3 # $v1 = $a1 - $a3
Run Code Online (Sandbox Code Playgroud)

  • @Amadeus我可能是错的,但对我来说,add64的第二行看起来应该是“sltu $t0,$v0,$a2”,因为看起来你是根据上半部分的天气任意设置“$t0”参数中的一个大于/小于另一个。 (2认同)