Copyright 守屋悦朗 2005 コンピュータの仕組み (1) ハードウェア 2.1 CPU の基本原理 2 つの整数の和を出力するプログラムを考えよう main() { int a, b, c; /* 変数 a,b が整数値をとる変数であることを宣言する */ a = 1; /* a に 1 を代入する */ b = 2; /* b に 2 を代入する */ c = a+b; /* a と b の和を c に代入する */ cout << c; /* c の値を出力する */ } コンピュータは このプログラムをそのまますぐに実行できるわけではない このプログラムは人間にとって理解し易い汎用高級言語 ( この例ではC++ 言語 ) で書かれたものであり コンピュータが直接認識して実行することはできない そのため コンパイラ (compiler) と呼ばれるプログラムによって コンピュータが直接理解して実行できる形の命令 ( 機械語命令 (machine instruction) と呼ばれ 対応するハードウェア的機構ないしはそれに近いものが存在するもの ) の列に翻訳する 1つの機械語命令は 命令の種類とその作業対象となるデータの入っている場所 ( アドレス ) などを 0,1 で表現したものであり このような機械語命令の列を機械語プログラムという 機械語 (machine language) は単に 0,1 の列であるが より人間に分かりやすいように記号化したものをアセンブリ言語 (assembly language) という X と Y の和を Z に代入するプログラム 機械語 (8080A) アセンブリ言語 (8080A) 汎用高級言語 00111011 LDA X Z=X+Y (FORTRAN) 00000000 LXI H,X COMPUTE Z=X+Y. (COBOL) 10000000 ADD M z:=x+y; (PASCAL) 10000000 STA Z Z X+Y (APL) 00100001 (SETQ Z (+ X Y)) (LISP) 00000001 Z=X+Y; (PL/I)
10000000 ADD M _z is _x+_y (Prolog) 00110010 STA Z z=x+y; (C) 00000010 10000000 高級言語と違い 機械語の仕様はCPU( すなわち 機種 ) ごとに異なっている 上の例に用いたのは インテル社製の 8080A と呼ばれるMPUの機械語である (8080A はマイコンが出現した当初の 8 ビットマシン MPU=micro processor unit=マイコンのcpu) 通常 機械語命令の種類 ( 命令セット ) は 100 個から 200 個くらいあり ( 命令の種類が複雑で多種な CISC 型コンピュータ (complex instruction set computer) と 命令を単純にして実行効率を向上させた方式の RISC 型コンピュータ (ristricted instruction set computer) とでは命令の数がかなり異なる ) 1つの命令は次のような構造をしている ( 命令によって 長さや形式がかなり異なる ): 1 2 3 命令コード補助情報命令の対象となるアドレスあるいはデータ 1の 命令コード はその命令の名前を 2 進数で表したものであり 3の アドレス部 にはその命令の操作対象となるデータが入っているメモリ ( 主記憶装置 ) のアドレス あるいは使われるデータ自身が入れられる 2( 修飾部 ) には レジスタ番号その他の補助情報が入れられる ( レジスタ (register) とは 演算に使われる少数個の高速メモリのこと ) 参考サイト MIPSの仕様 http://www.is.titech.ac.jp/~ohshima/ta/architecture/matsu/2/index.html 情報処理技術者試験アセンブリ言語 CASLの仕様 http://www.jitec.jipdec.or.jp/1_13download/hani01.pdf http://www.jitec.jipdec.or.jp/ ( 情報処理技術者試験センター ) さて 機械語に翻訳されたプログラムが行うことは次のようになる : 1 int a,b,c; によって主記憶装置上に int( 整数 ) 型変数 a,b,c それぞれのための領 域が確保される
2 a = 1; によって確保された変数 a に int 型の値 1が格納される ( 値 1は 機械語命令自身内に作られ その命令が実行されるか あるいは 主記憶装置内のデータ用領域に作られ それが演算装置を経由して変数に格納される ) 3 b = 2; についても2と同様 4 c = a+b; によって変数 a と b の値は " ロード命令 "( 機械語の命令 ) によって演算装置に渡され " 加算命令 " を使って和がとられ その演算結果が再び " ストア命令 " によって変数 c に格納される 5 cout << c; によって変数 c の値は出力装置 ( 例えば ディスプレイ ) に出力される 例えば 4 を行うためには次の 5 つの機械語命令が実行される : アセンブリ言語による記述 mov dword ptr [a (00428bf4)],1 mov dword ptr [b (00428bf8)],2 mov eax,[a (00428bf4)] add eax,dword ptr [b (00428bf8)] mov [c (00428bfc)],eax 定数 1 を a( アト レス 00428bf4) に格納せよ定数 2 を b( アト レス 00428bf8) に格納せよ a の値を演算装置にロート せよ同上演算装置に b の値を加算せよ同上演算装置の値を c( アト レス 00428bc) に格納せよ 対応する機械語命令の列 11000111 00000101 11110100 10001011 01000010 00000000 00000001 11000111 00000101 11111100 10001011 01000010 00000000 00000010 10100001 11110100 10001011 01000010 00000000 00000011 00000101 11111000 10001011 01000010 00000000 10100011 11111100 10001011 01000010 00000000 この機械語 1つ1つが何であるかを解読して 対応する処理を実行するために CPU は 各機械語命令を 命令の読み込み 命令の解読 命令の実行 結果の出力 というステップに分解して実行するというステップを繰り返す ( 下図参照 ) もう少し 細かく言うと 1 命令の読込み ( フェッチ ): プログラムカウンタ ( プログラム内のいくつめの命令を解読実行中であるかを記憶しておくためのメモリ ) が示すアドレスに従い主記憶装置から命令を読み出し 命令レジスタ (1つの命令を格納しておくためのレジスタ レジスタ (register) とは読み書きが高速にできるメモリのこと ) に格納する 次に実行すべき命令を示すようにプログラムカウンタの値を更新する ( 普通は現在実行中の命令の直後の命令
を実行するので 1 を足す ジャンプ命令の場合は 飛び先の命令の番号を入れる ) 2 命令の解読 ( デコード ): 命令レジスタの命令 ( 命令部とアドレス部と修飾部に分けられる ) のうち 命令部をデコーダー (decoder) に渡す デコーダーは渡されたものがどのような命令であるかを解読し 命令を実行するための制御信号を生成し 命令が主記憶装置上のデータを必要とするならば そのアドレスをアドレスレジスタに転送する 3 以下 命令の実行 : アドレスレジスタは インデックスレジスタやベースレジスタ ( これらのレジスタは アドレスを表すためのもので 実際のアドレスは ベースアドレスにインデックスレジスタの値を足したものになる ( アドレスの決め方は方式によって異なり もっと複雑な方式によっている場合もある ) の修飾をうけて 有効アドレスを割り出す 4 有効アドレスの該当アドレスに記憶されているデータをデータバス上に読み出す 5 メモリレジスタ ( メモリからのデータを記憶しておくためのレジスタ ) は データバス上のデータを受け取って記憶する 6 演算が必要なときは演算装置のアキュムレータ ( 演算器 accumulator) に渡す 7 アキュムレータは演算回路を使って演算を行う 8 以下 結果の格納 : アキュムレータは演算回路から演算結果を受け取る 主記憶 装置に格納する場合はいったんメモリレジスタに戻す 9 指定されたアドレスに演算結果を格納する 1 に戻る コンピュータの動作速度 コンピュータ内部のあらゆる処理は 一定の時間幅で同期をとって行われる この同期の幅 ( で時間を割ったもの=クロック ) が動作周波数である 例えば 1クロックが1 秒間に 1000 個であれば 1KHz( キロヘルツ ) 100 万個あれば 1MHz( メガヘルツ ) 10 億個あれば 1GHz( ギガヘルツ ) である このため 動作周波数が大きいほど処理速度が速い パソコンの場合 動作周波数はマザーボード上にある水晶発振器で作り出されるクロック信号をもとに 部品ごとに調整して用いられる CPU 内部での処理は動作周波数に合わせて 1クロックで1つの処理を行う すなわち 1クロック目に命令を読み込み 2 クロック目にそれを解読し 3クロック目に実行を行い 4クロック目に結果の書き込みを行う しかし これらの処理はそれぞれ CPU 内の別々の部分で行われるので 2 クロック目に 1 つ前の命令を解読すると同時に次の命令を読み込むことができ 2 クロック目には 2 つ前の命令を実行すると同時に 1 つ前の命令を解読し次の
命令も読み込むことができ というように同時に4つの処理を並行して行うことができる このような処理方法をパイプライン (pipelining) という ( 下図参照 ) 最近では CPU の内部処理を 4 ステップではなく 8 ステップあるいはそれ以上にしたり ( スーパーパイプライン : superpipelining) フェッチやデコードを複数同時に行い 演算器の数も増やして一度に複数の命令を処理できるようにしたり ( スーパースカラー : susperscalor) して 処理速度を上げることさえ行われている 動作周波数 1Hz 1 クロック =1 秒 1MHz 1 クロック =100 万分の 1 秒 命令処理の基本 1 クロック フデ実書 フ デ 実 書 フ デ 実 命令 4
パイプライン処理 1 クロック 命令 4 フェッチ デコード 実行 フェッチ デコード スーパースカラー処理 (2 命令並列の場合 ) 1 クロック 命令 4 参考ウェブサイト (CPU の動作原理 ) ht tp://sociolab.tamacc.chuo-u.ac.jp/~saizehp/2000zemi/line-p/0515/page4.html
CPU メモリ ( 主記憶装置 ) 命令 i 1 命令 フ ロク ラム データ i やテ ータの 読み込み 計算 2 計算 結果 データ 1 テ ータ領域 3 計算結果 の書き込み データ 2 上図 (CPU における命令の解読 実行サイクル ) の流れについては http://www.em.edu.waseda.ac.jp/~moriya/education/cai/infomath3/cpu.ppt を実行し てみよ 参考書 : 浦昭二 市川照久 情報処理システム入門 ( 第 2 版 ) 第 2 章 サイエンス社 1998. 田辺皓正 8086マイクロコンピュータ 丸善 1983. 小黒正樹 マイコン入門講座 廣済堂 1980.