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