MIPS溢出逻辑

时间:2016-09-28 07:28:32

标签: overflow mips subtraction

晚上好。我试图弄清楚如何确定整数是否符合MIPS中的16位整数。

我理解2 ^ 15-1 = 32767或2 ^(16-1)-1 = 32767并且我们想要二进制数的16位值。无论如何,我试图确定整数是否通过了测试。我写了这个:

addi $s3, $zero, 32767
bgt  $t2, $s3, else  #branch to else if t2>s3 
move $v0, $t2        #if no overflow; place t2 in v0
addi $v1, $zero, 0   #if no overflow; place zero in v1
   else:
      addi $v0, $zero, 0  #if overflow; place 0 in v0
      addi $v1, $zero, -1 #if overflow; place -1 in v1

无论如何,当我尝试评估负数时,我的逻辑存在问题。我明天有工作到期。我正在学习MIPS编程。我不是一个编程势利者,所以任何有用的建议都是值得欣赏的。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

这对你来说太迟了 1

如果编码为32位二进制补码数的 N 数字可以是 a ,则有点不清楚如果32位数字可以编码为16位数字,也可以编码为16位二进制补码或者如果要测试 b)

对于 b),您只需要测试是否设置了高于16的位:

#Assume $t0 is the number to test
lui $t1, 0xffff                      #$t1 = 0xffff0000
and $t1, $t1, $t0                    #$t1 is zero if all higher bits of $t0 are zero
beq $t1, $0 fits16bits               #Jump to label if fits

#Here the number doesn't fit 16 bits

对于 a)的情况,关键是要理解,就像数字0x00f1和数字0x0000000f1一样,前导零不重要,数字0xffff和数字0xffffffff是两个补码中的数字相同(数字-1)。
要将16位二进制补码扩展为32位,我们需要执行符号扩展,即复制上层原始数字的最高位(符号位) 16位。

因此0x7fff变为0x00007fff,0xc000变为0xffffc0000。

测试所有高17位相等的一种简单方法是将它们算术右移,这样如果它们实际上相等,我们最终会得到0x00000000或0xffffffff。

sra $t1, $t0, 15                     #Shift right 16 bits duplicanting the MSb 
beqz $t1, $0, fits16bits             #Jump to label if fits (All zero)

addiu $t1, 1                         #Add 1
beqz $t1, $0, fits16bits             #Jump to label if fits (Before +1 was all ones)

#Here the numbers doesn't fit

1 也许这样做会更好。