2016-09-28 45 views
0

晚上好。我试图找出如何确定一个整数是否符合MIPS中的16位整数。MIPS溢出逻辑

我知道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编程。我不是一个编程势力,所以任何有用的建议是值得赞赏的。感谢您的时间。

回答

0

这对你来说太晚了。

,每当你想测试一)如果一个数ň编码为32位二进制补码数,也可以编码为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, $0 fits16bits    #Jump to label if fits 

#Here the number doesn't fit 16 bits 

有关情况一)关键是要明白,就像数字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 

也许是这种方式更好。