2017-09-23 5 views
0

現在のPCが0x00400010(増分後)で、ターゲットラベルの値が0x00400040であると仮定します。命令の定数のバイナリ値は何ですか?MIPSのPCとラベルの追跡

beq $s0, $s0, target 

私はこの質問にどのようにアプローチするのか分かりません。私はヒント、またはこれに対する解決策を見つける方法の説明に感謝します。

+1

*命令内の定数のバイナリ値は何ですか?* - 定数は何ですか? – Marco

+0

定数のバイナリ値を求めるときに何を意味するのかよく分かりません – Andre

+1

あなたが直面している問題を理解できないので、もっと具体的にしてください。あなたは 'beq'が何をしているのか理解していませんか?あなたはPCに何が起こるかを理解していませんか?どうしたの? – Marco

答えて

1

私はあなたの質問を理解しているかどうかわかりません。私はあなたが命令にコード化されるオフセットを求めていると仮定しています。

対象が0x00400040で現在のPCが0x00400010であるため、オフセットはおそらく0x00000030になります(0x00400040 - 0x00400010 = 0x00000030)。これは簡単にバイナリ形式に変換することができます:

0000 0000 0000 0000 0000 0000 0011 0000 

ただし、私はMIPSを知らないことに注意してください。いくつかのプロセッサアーキテクチャでは、命令にコード化されたオフセットは、私はMIPSを知らないので、私はbeq命令のバイトサイズが何であるかを知らない

(target PC) - ((current PC) + (size of current instruction)) 

です。したがって、私はこの場合のオフセットを計算することはできません。 beq命令のサイズを教えたら、その回答を編集して追加します。

さらに、ほとんどのプロセッサアーキテクチャでは、ほとんどの命令で相対オフセットが制限されます。もう一度、私はMIPSを知らないが、オフセットは16,12、または8ビットに制限される可能性がある。その場合、実際のバイナリオフセット表現を取得するには、オフセットを格納するために使用されるビットだけが残されるまで、上記の2進数から左からゼロを削除します。

EDIT(口座にビジービーバーさんのコメントを取って)

MIPS上で、命令は32ビット/ 4バイトに整列しているようです。これにより、必要な実際のオフセットを4で割った値を格納することができます(CPUは実際のターゲットを計算するためにオフセットを読み取り、それに4を掛けます)。利点は、与えられたビットでより大きなオフセットを格納できることです。言い換えれば、2つのオフセットビットをそのように保存します。

例では、PCは0x00000030バイトだけジャンプしてターゲットに到達する必要があります。命令に格納されたオフセットは0x00000030/4となり、これは0x00000030 >> 2と同じです。これは0x0000000C0です。あなたはバイナリ表現を求めて:

0000 0000 0000 0000 0000 0000 0000 1100 

命令を実行/デコードすると、CPUが自動的4によって相殺することを乗算し、その方法は、所望のオフセット本物を取り戻します。

+2

Mmh、私はこれが起こるとは思わない。 'beq $ s、$ t、offset'は2つのレジスタが等しい場合に分岐し、' offset << 2 'のPCを進めます。だから 'target 'が' 0x00400040'ならnPCは 'PC +(0x00400040)<< 2'になります。 – Marco

+1

@BusyBeaverあなたのコメントと+1をありがとう。私が言ったように、私はMIPSを知らないが、明らかに命令は4バイトに整列されなければならない。私はそれに応じて私の答えを編集します。 – Binarus

関連する問題