MIPS 溢出逻辑

MIPS overflow logic

晚上好。我想弄清楚如何确定一个整数是否符合 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

当你想测试 a) 编码为 32 位二进制补码的数字 N 时,有点不清楚也可以编码为 16 位二进制补码,或者如果您想测试 b) 32 位数字是否可以编码为 16 位数字。

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, [=10=] 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, [=11=], fits16bits             #Jump to label if fits (All zero)

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

#Here the numbers doesn't fit

1也许这样更好