在MIPS中,如何将寄存器内容除以二?

在MIPS中,如何将寄存器内容除以二?,mips,divide,Mips,Divide,假设我有$t0,我想把它的整数内容除以二,然后存储在$t1中 我的直觉是:srl$t1,$t0,2 。。。但是如果。。。说。。。最右边的位是1?还是因为最右边的位(如果是正数)使$t0成为奇数,当被除时变成偶数 智慧的人啊,教我做无符号整数除法,没错。这只适用于无符号整数,如果您不关心小数部分。要进行无符号整数除法,这是正确的。这仅适用于无符号整数,如果您不关心小数部分。您将希望使用1而不是2的移位量: srl $t1, $t0, 1 如果使用2,则最终将除以4。通常,右移x除以2x。您需要使

假设我有
$t0
,我想把它的整数内容除以二,然后存储在
$t1

我的直觉是:
srl$t1,$t0,2

。。。但是如果。。。说。。。最右边的位是1?还是因为最右边的位(如果是正数)使
$t0
成为奇数,当被除时变成偶数


智慧的人啊,教我做无符号整数除法,没错。这只适用于无符号整数,如果您不关心小数部分。

要进行无符号整数除法,这是正确的。这仅适用于无符号整数,如果您不关心小数部分。

您将希望使用1而不是2的移位量:

srl $t1, $t0, 1

如果使用2,则最终将除以4。通常,右移x除以2x。

您需要使用1而不是2的移位量:

srl $t1, $t0, 1

如果使用2,则最终将除以4。通常,右移x除以2x。

使用指令sra:Shift right算术

sra $t1, $t0, 1
将$t0的内容除以2的一次幂

描述:移位寄存器值 按换档量(SHMT)和 将值放置在目标中 登记符号位被移入

操作:$d=$t>>h

预付款(4)

语法:sra$d,$t,h

编码: 0000 000--t tttt dddd dhhh hh00 0011

为什么这很重要?检查这个将整数(程序的输入)除以2的简单程序

编撰

root@:/tmp#gcc -c div.S
root@:/tmp#gcc -c main.c
root@:/tmp#gcc div.0 main.o -o test
试驾:

root@:~# ./test 2
div:1 udiv:1
root@:~# ./test 4
div:2 udiv:2
root@:~# ./test 8
div:4 udiv:4
root@:~# ./test 16
div:8 udiv:8
root@:~# ./test -2
div:-1 udiv:2147483647
root@:~# ./test -4
div:-2 udiv:2147483646
root@:~# ./test -8
div:-4 udiv:2147483644
root@:~# ./test -16
div:-8 udiv:2147483640
root@:~#
看看会发生什么?srl指令正在移动符号位

-2=0xFFFFFE

如果我们向右移动一位,我们得到0x7fffffff

0x7FFFFFF=2147483647


当然,当数字是正整数时,这不是问题,因为符号位是0。

使用指令sra:Shift right算术

sra $t1, $t0, 1
将$t0的内容除以2的一次幂

描述:移位寄存器值 按换档量(SHMT)和 将值放置在目标中 登记符号位被移入

操作:$d=$t>>h

预付款(4)

语法:sra$d,$t,h

编码: 0000 000--t tttt dddd dhhh hh00 0011

为什么这很重要?检查这个将整数(程序的输入)除以2的简单程序

编撰

root@:/tmp#gcc -c div.S
root@:/tmp#gcc -c main.c
root@:/tmp#gcc div.0 main.o -o test
试驾:

root@:~# ./test 2
div:1 udiv:1
root@:~# ./test 4
div:2 udiv:2
root@:~# ./test 8
div:4 udiv:4
root@:~# ./test 16
div:8 udiv:8
root@:~# ./test -2
div:-1 udiv:2147483647
root@:~# ./test -4
div:-2 udiv:2147483646
root@:~# ./test -8
div:-4 udiv:2147483644
root@:~# ./test -16
div:-8 udiv:2147483640
root@:~#
看看会发生什么?srl指令正在移动符号位

-2=0xFFFFFE

如果我们向右移动一位,我们得到0x7fffffff

0x7FFFFFF=2147483647


当然,当数字为正整数时,这不是问题,因为符号位为0。

如果您关心“舍入”问题,并且希望进行舍入,则在执行逻辑(无符号)移位之前,只需增加1即可

其他人之前已经说过了,但你们只需要将1除以2。N位右移除以2^N


若要对N而不是1的移位值使用舍入(舍入为0.5或更大),只需添加1如果您关心“舍入”并希望进行舍入,则可以在执行逻辑(无符号)移位之前增加1

其他人之前已经说过了,但你们只需要将1除以2。N位右移除以2^N


要使用移位值为N而不是1的舍入(0.5或更大的舍入),只需加1将奇数除以2并不一定会得到偶数。对于有符号,该移位实际上除以4,而不是2
sra
,对于无符号,
srl
。@Tom:使用整数除法,7/2=3,这是奇数。将一个奇数整数除以2不一定会得到一个偶数整数。这个移位实际上是用4除,而不是用2除有符号的,而用srl除无符号的…@Tom:用整数除,7/2=3,这是奇数。哦,对了,我犯了一个愚蠢的错误。我是说1,不是2,谢谢你抓住了那个。哦,对了,我犯了个愚蠢的错误。我的意思是1,不是2,谢谢你抓住了那个。我添加了一个例子,运行gxemul mipsI添加了一个例子,运行gxemul Mipsy你确实错过了一些东西。请看上面Tom的评论——你用1除以2,而不是2位!你确实错过了什么。请看上面Tom的评论——你用1除以2,而不是2位!