2012-04-11 10 views
5

これを正しく理解すれば、プログラムカウンタは実行される命令のアドレスを指し示し、ほとんどの場合、次の命令アドレスに進むためにプログラムカウンタに4を加算します。しかし、メモリ内の単語(例えば、ワード15)を指しているプログラムカウンタがあり、次の命令に進むには、次の命令を得るために15を4に直接加算すると仮定していますか?どんな説明もあります。プログラムカウンタ?

答えて

6

そのことを命令ポインタといいます。プロセッサが現在の命令をデコードすると、それは占有するバイト数を検出し、現在の命令ポインタ値にどの程度加算して次の命令に進むかを知るので、現在の命令が実行されたときにプロセッサは次に何をするかを知る。

例えば、プロセッサはあなたの例のように値15を格納している命令ポインタから始まります - そのアドレスに何が起こっているかを見て、5バイトを占める命令があっても問題ありません。現在の値であり、これにより20が生じるので、命令ポインタは現在値20を格納し、プロセッサは現在の命令を実行する。

+1

あなたの例は理にかなっていますが、追加するものがそのアドレスのwhatsに依存する場合、PC + 4はどこから来ますか? – Ockham

+1

@ user28694:これはプロセッサによって異なります。一部のプロセッサでは、すべての命令の長さが同じであるため、無条件に+4にすることができます。一部のプロセッサは可変長命令を持ち、命令自体の最初のバイトを使用して処理する命令を決定します。 – sharptooth

+0

[MIPS命令はすべて32ビット長ではありません](http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats)? –

2

プログラムカウンタを直接進めることはありません.CPUはプログラムを実行することであなたのために実行します。プログラマは、さまざまなジャンプ命令(条件付き、無条件、サブルーチンへのジャンプなど)を実行することによってプログラムカウンタを操作します。プログラムカウンタにオフセットを追加する必要がある特定のケースは、位置に依存しないコードで分岐する場合です。ただし、この場合でも、プログラムカウンタに命令のサイズを追加することはありません。代わりに、 "相対アドレスへの分岐"を実行してジャンプ先のオフセットを指定します。

+0

絶対アドレス0x4000にあるアプリケーションコードにジャンプするブートローダを作成するときはどうでしょうか?この場合、プログラムカウンタを絶対アドレスに直接変更します。 – eepty

+0

@eeptyこれは、2番目のセンテンスが言うことです:あなたはレジスタ設定命令ではなく、ジャンプ命令でそれを実行しています。 – dasblinkenlight

関連する問題