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

时间:2009-10-15 01:34:54

标签: mips divide

假设我有$t0,我想将其整数内容除以2,并将其存储在$t1中。

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

...但如果...说...最右边的位是1,那不会是一个问题吗?或者这一切都是在洗涤中出现的,因为最右边的位(如果是正数)会使$t0成为奇数,在分割时会变为偶数?

教导我,明智的人......

4 个答案:

答案 0 :(得分:6)

使用指令sra:右移算术!!

sra $t1, $t0, 1

将$ t0的内容除以2的第一个幂。

  

描述:移位寄存器值   按移位金额(shamt)和   将值放在目标中   寄存器。符号位移入。

     

操作:$ d = $ t>> H;

     

advance_pc(4);

     

语法:sra $ d,$ t,h

     

编码:   0000 00-- --- t ttt dddd dhhh hh00   0011

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

    #include <stdio.h>

    /*
    * div divides by 2 using sra
    * udiv divides by 2 using srl
    */
    int div(int n);//implemented in mips assembly.
    int udiv(int n);
    int main(int argc,char** argv){

            if (argc==1) return 0;
            int a = atoi(argv[1]);

            printf("div:%d udiv:%d\n",div(a),udiv(a));
            return 1;
    }
    //file div.S
    #include <mips/regdef.h>

    //int div(int n)
    .globl div 
    .text
    .align 2
    .ent div
    div:
            sra v0,a0,1
            jr  ra        //Returns value in v0 register.
    .end div

    //int udiv(int n)
    .globl udiv
    .text
    .align 2
    .ent udiv
   udiv:
     srl v0,a0,1
     jr  ra        //Returns value in v0 register.
   .end udiv

编译

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 = 0xfffffffe

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

  

0x7ffffffff = 2147483647

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

您需要使用1的移位金额,而不是2:

srl $t1, $t0, 1

如果使用2,则最终除以4.通常,右移 x 除以2 x 。< / p>

答案 3 :(得分:0)

如果你担心“四舍五入”而你想要向上舍入,你可以在做逻辑(无符号)转换之前加1。

其他人之前已经说过,但你只是将1移位除以2.右移N位除以2 ^ N.

要使用除了1之外的N的移位值进行舍入(向上舍入为0.5或更大),只需在移位之前加1 <&lt;(N-1)。