• ベストアンサー

プログラムカウンタのハードウェアの動き方

プログラムカウンタを変える命令が実行されたら、本当に即座にそこへ飛んでいき、追い越し・逆走何でもありだそうで、いちいち順に飛ばし読みをしたりはしないと聞きました。 ここで聞きたいのは プログラム実行後に順次進行、追い越し、逆走するときに(例えばカウンタ009から001)に即座に飛んでいくまでのハードウェアの働きのプロセスをプログラム的に教えてほしいということです。 自分が想像する例として 1.カウンタ009のプログラムを実行する。 2.プログラムカウンタを計算する。 3.プログラムカウンタを読んでそこだけに電気を流す? 4.・・・なぜ001のプログラムに即座に戻れるのか?なぜ002などほかのプログラムは無視できているのか?ほかのところは電気が流れないのか?というか電気が流れないとプログラムは実行できないのか?など 勉強不足ですいません。 自分はフローチャートを指でなぞっていく考えのせいか、順次進行でプログラムを進めていくという概念から離れることが困難で、即座に追い越し、即座に逆走をするハードウェアの動きがイメージできません。 何か詳しいサイト等がありましたらそれも教えていただけるとうれしいです。 長くなりましたがよろしくお願いします。

  • RWSP
  • お礼率93% (124/133)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ハードウェアに関する知識をどのくらいお持ちなのか分からないですが、適当に答えてみます。 標準ロジックICには74161、74163、74191、74193カウンタ回路が用意されています。 http://ja.wikipedia.org/wiki/%E6%B1%8E%E7%94%A8%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AFIC (標準ロジックICの等価回路はデータシート検索すれば直ぐ見つかると思うので省略します) カウンタ出力をS-RAMのアドレスに接続されているような回路をご想像いただければと思います。 このカウント値(アドレス値)がプログラムカウンタ。 で、S-RAMの出力データが実行される命令。 ジャンプ命令は標準ロジックで言うとロードやプリセットと同様にカウンタの初期値を与える動作を行う。 このように考えると分かりやすくなりませんか?(逆に分かりにくい?)

RWSP
質問者

お礼

ありがとうございます

その他の回答 (2)

noname#194317
noname#194317
回答No.3

変に難しく考えすぎていますね。順次実行だろうとジャンプだろうと、考え方は同じですよ。CPUとしては、プログラムカウンタが指しているメモリアドレスの命令を取り込んで実行するだけです。 通常の命令なら、その命令長(オペランドがある場合はその長さも含む)だけプログラムカウンタが加算され、分岐命令だったらプログラムカウンタに分岐先のアドレスがセットされます。どんな命令であれ、実行されればプログラムカウンタの値が変化し、その値を参照して次の命令を実行するという点では同じなんですよ。違いは変化量のみです。 フローチャートだって、分岐したら一気に手前とかに飛んでるじゃないですか。人間だって英単語を辞書で引く時、調べたい単語がMARCHだったら、いきなりMのページから調べるでしょう?1ページから全ての単語を順に追って、MARCHが出てくるまで捜すなんて人はいませんよね? また順次実行にしても、例えば009のプログラムを実行している時、他のアドレスに入っているプログラムは無視しているわけです。分岐しようがしまいが、今注目している以外の命令を無視していることに、変わりはありません。

RWSP
質問者

お礼

ありがとうございます

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

プログラムカウンタが保持しているのはメモリアドレスです。 メモリにはランダムアクセスできるんだから 順序なんてどうにでもなるでしょ。 > 自分はフローチャートを指でなぞっていく考えのせいか、順次進行でプログラムを進めていくという概念から離れることが困難で、 あなたのフローチャートには分岐やループがないのですか? > 何か詳しいサイト等がありましたらそれも教えていただけるとうれしいです。 本当に勉強したいなら、 計算機やコンピューターアーキテクチャに関する書籍を読んだほうが良いと思います。 一応こんなの見つけたけど、入門向きじゃなさそう。 https://jndb.pc.mycom.co.jp/column/architecture/index.html

RWSP
質問者

お礼

ありがとうございます

関連するQ&A

  • プログラムカウンタの動き方

    プログラムカウンタは命令を実行するたびにカウンタに1を足して順次進行をしていくことはわかります。 ですがif文やwhile文はよく「もし大きければ004番地にジャンプする」などとたとえられています。 自分は順次進行しながら004番地まで命令を無視しているのか それとも本当に002、003のところを飛ばしているのかを考えています。 while文も同じく、001から009まで実行して、もし条件を満たしていなければ001に戻るというとき、プログラムカウンタは逆走して即座に001に戻るのでしょうか? それとも順次進行をしながら、001に戻るまで命令を無視しているのでしょうか? 自分が聞きたいのは、順次進行を守って命令を無視しているのか? それとも、逆走したり、ジャンプしたりしているのか? それとも、もっと別の手段があるのかということです。 よろしくお願いします。

  • 自前のアクセスカウンタを作成したいのですが

    会社で自分のホームページを運用?してます。 プログラムの実行ファイルを載せてユーザーにダウンロードさせるだけの簡単な物です。 これにアクセスカウンタを付けたいと思ってます。 他のサイトを参照するアクセスカウンタで無く社内のアクセスだけで済むカウンタが理想です。 ホームページ用のサーバーはWIN2000だと思います。 レンタルでもいいですがソースは社内サーバーにしたいです。出来れば自分で作成したいと思ってます。 何から始めたらいいですか?

    • ベストアンサー
    • CGI
  • プログラムの実務で

    よろしくお願いします。 現在パソコンの講師の仕事をしています。 高校の情報処理の授業を担当することになりました。 自分自身はプログラムを組んだ経験はありませんが プログラミングの説明をしなければなりません。 BASICの基礎なのでたいしたことはしないのですが 実際に実務をするときに教科書に書いてあるような 下記の流れでよいのかを知りたいです。 問題の分析 → 流れ図の作成 → コーディング → プログラムの入力 → テストラン・デバッグ → プログラムの実行 流れ図はフローチャートシートにテンプレートを 使って書き、コーディングシートに記入する、と 書かれてるのですが、実際にされてるのでしょうか? 教科書がちょっと古そうなので実務と少々ギャップが あるような気がするのですが・・・

  • 実行プログラム名の取得

    Linux上にてC言語でプログラムを書いています。 実行中のプログラムから、自分が起動された際のLMの名前を得るには 一般的にはどうしたらいいのでしょうか? 色々考えた結果、 getpidにてプロセスIDを取得し、/procより自プロセス情報を参照すること によって実現はできたのですが、もっとスマートな方法はないのでしょうか? また、この方法だと/procをサポートしていない他のUNIX(系)OSの場合では 実現できないことになってしまうので、別な方法はないのでしょうか? ご存知の方いましたら宜しくお願いします。

  • あるプログラムから別のをプログラムを操作する方

    Windows XPにおいて、ソフトAがあるとします。 このソフトAは実行時に、テキストボックスと実行ボタンからなるウィンドウから構成され、 実行ボタンを押すと、テキストボックスの入力に応じた、特別なファイルを生成します。 現在、「テキストボックスへの入力」「実行ボタンのクリック」を手動で行っているのですが、作業量が多いため、自動で行いたいと考えています。 具体的には、テキストボックスに入力したい文をあらかじめテキストファイルにまとめて作成しておき、自動で次々とファイルを生成したいと思います。 キーボードやマウスの操作を記憶するフリーソフトを試してみましたが、ウィンドウの位置を合わせなくてはならない、実行中他の操作が一切できない、実行中の進行具合が見づらい、テキストファイルのエラーチェックができないなど、こまごまとした点で不満が残ります。 そこで、自分でプログラムを作成し、ソフトAを操作するようなプログラムを作りたいと思うのですが、どのようなものが必要でしょうか?

  • プログラムにWINDOWSから自動で割り当てられたフォルダを割り当て解除する方法

    レジストリに、  HKEY_CLASSES_ROOT   Folder    shell     program1で処理      command ・・・ データは、「C:\~\program1.exe "%1"」を指定 と登録する事で、Explorerの右クリック・コンテキストに「program1で処理」を追加し、 例えば、フォルダAAを右クリックし、「program1で処理」を選択すると、 C:\~\program1.exe AA がコマンドとして実行され、 実行されたprogram1.exeでは、フォルダAAを処理したいのですが、 AAが、program1.exeに既に割り当てられており、困っています。 AAを割り当てない、叉はprogram1.exeに割り当てられたAAを割り当てから外す事は出来るでしょうか? program1.exeは、C#.NETで作成しています。 参考)最終的にやりたいことは、AA(フォルダ、またはファイル)の移動(move)ですが、moveによる削除の段階で「他のプロセスに割り当てられている」と怒られてしまいます。この「他のプロセス」と言うのが調べたところ、自分自身なのです。

  • cgiで呼び出したプログラムを数分後killする

    cgiで呼び出したプログラム(延々と実行します)を、 指定した時間後にkillするcgiを作りたいです。 ここでプロセスidはすでにわかっており、 killコマンドは使えます(linuxを自分で立ち上げてるので) というか、chmod 4755にしておくので 指定する時間はformから受け取るつもりです。 時間は数分、数時間単位、もしくは数日単位です。 あと、formからメールアドレスを受け取って、 プロセスをkillしたあと、その処理結果を受け取ったメールアドレスに送信もしたいです。 メールサーバは立ち上げています。 質問ばかりですいません。 お知恵を拝借させてくださいm(__)m

    • ベストアンサー
    • CGI
  • 指定プログラムのプロセスを監視・killするには?

    CGIが不正終了(もしくは無限ループ)して、CPUに負担をかけ続けることで悩んでいます。 topコマンドで負担をかけているプロセスを発見してkillすることは可能ですが、これを自動で実行するようなことはできないでしょうか。 cronを使って1分間に1度チェックし、3分以上同じプロセスが動いている場合にkillしたり、もしくは不具合の起こる特定のプログラム(hoge.cgi等)を監視してkillするということができるようにしたいのです。 自分で考えたのは「top -n 1」で出力して、3分間同じプロセスがCPUに負担をかけ続けている場合にkillできるようにphpなどでプログラミングすることでしたが、もっと簡単にできるような方法がありますでしょうか。

  • C#で自己プロセスが消えない状態になる

    今製作中のクライアントアプリで困っていることがあります。 既存のプログラムをキックするプログラムなのですが、プロセスのキックを行うとなぜか自分の処理を終わらせてもプロセスが生きている状態に陥ります。 プロセスのスタートは、 Process.Start(・・・・・); で実行しています。 終わらせるときは何をやってもダメです。 this.Close(); などなど・・・ フォームが消えてもまだなおプロセスは生き続けてゾンビ化します。 どなたか教えていただけませんでしょうか?

  • シェルのプログラム

    以下の項目を実現するプログラムを作っています。 コマンドプロンプトを表示し、キーボードからコマンドを文字列として入力する。入力した文字列を調べ、forkして子プロセスを作る子プロセスで、調べたコマンドをexecする、親プロセスは子プロセスの終了を待って、始めに戻るというプログラムです。自分なりにあれこれ作ったのが下のです。 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> void read_command(char *command, char *p) { static char buf[100]; fgets(buf, 100, stdin); sscanf(buf, "%s %[\n]", command,p); } int main(void) { pid_t pid; int status; char command[100], p[100]; while (1) { printf("command>"); read_command(command, p); pid = fork(); if (pid < 0) { printf("forkできません\n"); continue; } if (pid != 0) { wait(&status); } else { execve(command, p, 0); } } return 0; } 子プロセスと親プロセスでのforkの仕方が分かりません。 実行したら下のような結果になるようにしたいのですが、できません。 どなたか、教えてください。 $./sh command> ls a.out ・・・・・・