- ベストアンサー
プログラムカウンタの動き方
プログラムカウンタは命令を実行するたびにカウンタに1を足して順次進行をしていくことはわかります。 ですがif文やwhile文はよく「もし大きければ004番地にジャンプする」などとたとえられています。 自分は順次進行しながら004番地まで命令を無視しているのか それとも本当に002、003のところを飛ばしているのかを考えています。 while文も同じく、001から009まで実行して、もし条件を満たしていなければ001に戻るというとき、プログラムカウンタは逆走して即座に001に戻るのでしょうか? それとも順次進行をしながら、001に戻るまで命令を無視しているのでしょうか? 自分が聞きたいのは、順次進行を守って命令を無視しているのか? それとも、逆走したり、ジャンプしたりしているのか? それとも、もっと別の手段があるのかということです。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
カウンターという名前からそんなことを連想してしまうのですね。 カウンターと言っても自分で計数しているわけでは有りません。 順次進行や逆送、命令無視などは一切ありません。 単なるレジスター(一種の記憶装置)です。 1命令実行したとき、ある数だけ増えます。(加算回路が別にある) 1とか2とか4とか機械によって違います。 同じ機械でも命令語によって数(命令語長)が違うものも多いです。 無条件ジャンプ、条件付ジャンプ、サブルーチンへのジャンプ等は 命令語の中のアドレスやレジスターの値あるいはこれらから参照するメモリー内のアドレス(実効アドレス)を プログラムカウンターに代入します。 実行中の命令が完了したときにはジャンプの体制が整っています。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
ちなみに多くのプロセッサでは「プログラムカウンタ (PC)」と呼んでますが, x86 だけは「インストラクションポインタ (IP)」と呼んでます. こっちの呼び方だとあんまり問題にならないように思える.
プログラムカウンタを変える命令が実行されたら、本当に即座にそこへ飛んでいきます。追い越し・逆走何でもありです。いちいち順に飛ばし読みをしたりはしません。 分岐命令は、順次実行する順序を変更する命令である、と考えてください。サブルーチンを呼ぶ命令も同様に、即座に移動です。メモリ空間がごく狭いコンピュータならいざ知らず、何GBもメモリを積んだマシンで飛ばし読みなんてやってたら、遅くて話になんないですよ。でないと、今いるメモリアドレスよりほんの少し前に戻る分岐なんて、ものすごく非効率になるじゃないですか。 それと順次実行時も、カウンタに1を足すとは限りません。x86などの可変長命令アーキテクチャのCPUだと、命令長もオペランドも可変ですから、プログラムカウンタに足し込む数も可変です。
お礼
ありがとうございます。 本当に即座にそこへ飛んでいくのですか。 ハードウェア的に想像ができませんでした。 確かに自分も順次信仰をするのはすごく非効率だとは思っていました。
お礼
ありがとうございます。 順次進行も逆走も命令無視もないのですか。 自分もそうだろうとは思ったんですが、それをハードウェア的に想像することができませんでした。