2017-09-30 10 views
1

にC++の関数を変換しますか?はMIPS

私は、次のと考えてきました:

addi $v0, $a0, -2 
jr $ra 
*********************** 
jr $ra 
addi $v0, $a0, -2 
*********************** 
addi $v0, $a0, 2 
jr $ra 
*********************** 
lw $v0, 0($a0) 
addi $v0, $v0, -2 
jr $ra 

私は、MIPSの関数を学んだし、アドバイスをいただければ幸いです。この場合に 'lw'命令を使用することに何らかのポイントがありますか?

+4

Andre、戻り値のアドレスが格納されているABIバリアントにはどのようにパラメータが渡されますか? MIPSのバージョンは何ですか?それは "ブランチ[遅延スロット](https://en.wikipedia.org/wiki/Delay_slot)"を持っていますか? LWはRAMメモリからデータをロードするためのものです:https://en.wikipedia.org/wiki/MIPS_architecture#Loads_and_stores – osgx

答えて

1

あなたの結果は正しいが、少なくとも最初のものは正しい。 hereによると、最初の答え:

addi $v0, $a0, -2 
jr $ra 

が正しいです。即時命令を使用するとメモリからフェッチを減らすことは言うまでもなく、実行速度を向上させる命令の量を最小限に抑えます。

  • $v0は、関数からの最初の戻り値がどこに行くべきかのレジスタです。
  • $a0は、関数を呼び出すときに使用する最初の入力パラメータのレジスタです。
  • $raは、前のジャンプ命令からのリターンアドレスを保持するレジスタです。

だから、誰かがあなたのアセンブリ関数を呼び出すと思ったことは次のようになります。

int x = calc(5); // This line is the `C` equivalent and not part of assembly code. 

総会は次のようになります。

li $a0, 5 # Load immediate the value 5 into register $a0. 
jal __calC# Jump to the sub routine '__calc' and store return address in $ra. 
      # Result will now be in $v0. 
... 

__calc: 
    addi $v0, $a0, -2 
    jr $ra 

ができればlwよう指示から離れて滞在してみてください。彼らはRAMに出て、CPUのレジスタに値を保持するのと比べて非常に遅いメモリをフェッチします。

+0

私は、これを含むMIPSで書こうとしている関数のいくつかが、 'lw'や 'sw'のような指示は、私はエラーが表示されます。 通常、エラーメッセージには「フェッチアドレスがワード境界に揃っていません」と表示されます。これは、あなたがRAMから値を取り出すことについて言及した点で何かを意味しますか?私は以下を使用しています: ori $ a0、$ 0,5 5 テスト目的で$ a0を5に初期化します。 $ a0の値を制限しないと、 'lw'命令を使ってエラーを避けることができると思いますか?これはちょうど好奇心の外ですが、私はすでにあなたの答えに満足しています。 – Andre

+1

レジスタ '$ a0'の' 5'のような値をレジスタに入れたいのであれば、 'load immediate'命令' li'を使うことができます。 'li $ a0、5'は$ a0 = 5と同じです。' lw'や 'sw'のような命令を使うときは、レジスタとRAMアドレスが必要です。もしあなたが 'lw $ a0、5'を使って、アドレス '5'のRAMの内容を' $ a0'にロードするのと同じであれば、RAMの内容は何でもかまいません。 RAMアドレス「5」はカーネル使用のために制限されてもよく、ユーザ空間メモリはフェッチエラーを生じるRAMアドレスでより高く開始する。 – user2205930

+1

「アドレスをワード境界に整列させない」という問題は別の問題です。WORDはCPUのレジスタサイズで、32ビットと仮定します。つまり、RAMに読み書きするときは、指定したアドレスが32ビットで整列されている必要があります。あなたのセットアップの正確な詳細を知らなければ、これは私が与えることができる最高の答えです。通常、任意のRAMアドレスが有効です。 – user2205930