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
要减去一个数字,即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)