MIPSでは、どのように私は2つのことでレジスタの内容を分けるのですか?

StackOverflow https://stackoverflow.com/questions/1569870

  •  21-09-2019
  •  | 
  •  

質問

レッツ言う私は$t0を持っている、と私は2によってその整数内容を分割し、$t1に保管したいと思います。

私の腸は言う:srl $t1, $t0, 2

...でもあれば...と言う問題では...一番右のビットが1だったことではないでしょうか?それとも、それはすべての洗浄に出てくるんので、一番右のビットになり割った場合にもなっ奇数を、$t0(正の場合)?

ティーチ私、O賢明なもの...

役に立ちましたか?

解決

使用命令SRA:右シフト算術!!

sra $t1, $t0, 1

除算2の第1の電力によって$ T0の内容

  

説明:シフトレジスタの値   シフト量(shamt)とすることにより、右   先に価値を置きます   登録。符号ビットがシフトインされます。

     

動作:$ D = $ T >>時間。

     

advance_pc(4)

     

構文:SRA $ dを、$ T、H

     

エンコード:   0000 00-- ---トンTTTT 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

私たちは右に1ビットをシフトするならば、我々は0x7FFFFFFFで

を取得
  

0x7ffffffff = 2147483647

はもちろんこれは、符号ビットが0であるため、数は、正の整数である場合、問題ありません。

他のヒント

符号なし整数の除算、thatsの権利を行うには。あなたは小数部分を気にしない場合にのみ、符号なし整数のために動作します。

あなたは、1のシフト量を使用したいと思うでしょうではない2:

srl $t1, $t0, 1
あなたは2を使用する場合は、右シフトし、一般的には4で割ることになります。のX の2で割り、 のX

あなたは「丸め」を懸念している、あなたはあなただけの論理(符号無し)シフトを行う前に1ずつ増加することができます。、切り上げしたい場合は、

そしてもう一つは、以前にそれを述べてきたが、あなたは唯一の2分周に1で2 ^ NによってNビット除算することにより右シフトをシフトします。

の直前にシフト1 <<(N-1)を追加し、1以外Nのシフト値と(0.5以上で切り上げ)丸めます。

を使用するに
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top