2016-05-03 9 views
1

私はMIPS命令を研究しています。この問題は、MIPSのドキュメントが提供されている答えとは異なる何かを言っているようであるため、私は少し混乱しています。ここに問題とその答えがあります:ジャンプとリンクレジスタMIPS

0x5000のこの命令では、どのようなレジスタが参照または変更されていますか?

0x5000 : 0x0140F809 

答え:

オペコード= 0x00、R型、関数=の0x09の(jalr)、ルピー= 10($t2

$t2

プットに対処するためにジャンプ0x5004 in $ra

しかし、レジスタ31($ra)には、PC + 4が置かれていると書かれています。命令が0x5000番地で実行されているので、PCは0x5004でしょうか?したがって、JALR命令は、0x5004 + 4または0x5008を0x2004ではなくPCに入れますか?

技術的にはジャンプ後の命令なので0x5004に戻るはずですが、ドキュメンテーションで明示的にR [31] = PC + 4と表示されるので少し混乱します。 x5008になります。ありがとう!

答えて

2

考慮すべきことは、分岐遅延スロットです。

最初に、オフになっているケースを処理しましょう。これは、spimmarsのようなシミュレータのデフォルトです。状況は単純です:

5000: jalr $10      # (1) $31 will have 5004 
5004: nop       # (2) this executed upon return 

これはほとんどのアーキテクチャが動作する方法です。

しかし、mipsには[上記の]分岐遅延スロットがあります。

遅延が後の制御命令のすべての転送(例えば、分岐、ジャンプ、JAL、JALR)は無条件ある遅延スロットに、次の単一の命令である、または実際のハードウェア[シミュレータに]有効になっている場合前が実行された分岐が実際に行われる[またはない]:

5000: jalr $10      # (1) $31 will have 5008 
5004: nop       # (2) this executed _before_ branch taken 
5008: nop       # (3) this executed upon return 

だから、有効実行順序は実際には(2)、(1)、(3)。

一般的なケースでは、次の3つのステップ配列を有する:

5000: beqz $10,foobar    # (1) conditional branch to foobar 
5004: nop       # (2) executed _before_ branch taken 
5008: nop       # (3) executed _after_ if branch _not_ taken 

もう一度、実効実行順序は、(2)になり、(1)。次いで、foobarの最初の命令のいずれかが実行され5008にまたは命令【分岐がを撮影した場合】分岐がが取られていない場合(3)実行されます。

よろしくお願いします。なぜ

初期のMIPSチップでは、命令がプリフェッチされました。例えば、サイクルN + 1の命令は、サイクルN(1つのサイクル遅延)でプリフェッチされている可能性があります。

したがって、サイクルN、実行ユニットがN-1(例えば5000)のサイクルでフェッチされた命令を実行している命令、命令プリフェッチ単位は(5004で)次の命令をフェッチしているに。それらは1サイクル遅延と重複している。サイクルN + 1では、実行ユニットがプリフェッチされた命令を実行しており(5004で)、プリフェッチユニットが次の命令をプリフェッチしている(5008で)。

これは、制御命令の条件付き転送が発生するまで有効です。

遅延スロットがなければ、プロセッサはストールしなければならず、ブランチと同じサイクルでプリフェッチされた分岐後の命令はが無駄になりますです。遅延スロットの実行では、通常、スロットに何か役に立つものがあるため、プリフェッチを無駄にする必要はありません。

しかし、それは少し複雑になります。