1 1
第7章 計算の機構
コンピュータの基本構成 CPU アセンブリ言語 論理演算、MIL記法 半加算器、全加算器 2 2計算の実現機構
• プログラム内蔵方式(フォンノイマン型コンピュータ) – メモリ上にデータとプログラムを保持 – 万能チューリング機械(6.2.1項)と同様に他の計算機を模 倣できる ⇔ 最も初期のコンピュータ(ENIAC,1946)はプログラムを配線 していた 3 3 パソコンの歴史 1970年アラン・ケイ「パーソナルコンピュータ」を提唱。「コン ピュータ・リテラシ」も彼の造語。ダイナブックを具現化。ハー ドウェア Alto, 暫定的ソフト Smalltalk . Æスティーブ・ジョブズ Lisa, Macintosh へ1976年Apple I、 翌年 Apple II 大成功を収める。
1970年代後半~80年台前半 多くの非互換機メーカーが競合 1981年IBM PC 16ビットコンピュータ ÆPC/AT 互換機が業界標準、アップルは非互換機路線を堅持 2004年IBM はパーソナルコンピュータ事業を中国のレノボ・グ ループに売却。ハードウエアのオープンアーキテクチャ化を 大きな要因として繁栄したPC/AT互換機であったが、最終的 にはその互換機によって市場から撤退することとなった。 4 4 日本のパソコンの歴史 「国産マイコン」の最初の製品は、1976年日本電気 (NEC) より 発売されたTK‐80とされる。 その後 8ビットマイコン・BASICと群雄割拠の時代 1982年 16ビットCPUを採用した「PC‐9800シリーズ」が発売。そ の後はMS‐DOSを採用したPC‐9800シリーズの独走態勢と なった。 Macintoshは、漢字Talk7が発売された頃から、ハードウェアの 値下げと日本語処理機能の充実により、シェアを伸ばして いった。 1995年にGUIを大改良したWindows 95の発売が開始されると、 98互換機のエプソンもPC/AT互換機に転換し、国内独自パソ コンの歴史は完全にピリオドが打たれた。 5 5
インターネットの歴史
• 1969年冷戦時代のアメリカで国防用の分散 型ネットワーク ARPANET が開発された • 1986年に軍事用のARPANETから分割される 形でアメリカ科学財団のNFSNetが作られた • 1995年にはNSFNet は民間へ移管された。 LANのプロトコルとして複数のプロトコルが使 われていたが、現在ではLANでもTCP/IPがデ ファクトスタンダードになっている。 6 6写真で見るマザーボード
7 7
計算機の基本構成
(中央演算処理装置) 8 8 ソフト ソフト データ 1. アプリケーションソフトの起動 2. データファイルの読み込み 3. ソフトの作業 4. データファイルの保存(Save) 5. ソフトの終了 データ アプリケーションソフトの起動と終了 CPU 中央演算 処理装置 バスライン 外部メモリ (ハードディスク) メインメモリ (RAM) データ データ 9 9 加算器 制御部 演算部 32 ビット デコーダ コントローラ プログラム カウンタ レジスタ RAM メインメモ リ ハード ディスク 外部記憶 装置 CPU 入出力バスライン CRT,キーボード、 マウス、プリンタ 入出力装置 10 10 制御部 デコーダ メモリから読み出された2進数の命令をコントローラに指示を出す。 コントローラ デコーダからの命令とクロック信号などのタイミング信号とを複 合させて、演算器やレジスタなどを動作させる制御信号を発生する。 レジスタ CPU の中のメモリ。演算のためのデータや演算結果を一時的に保存する。 その内訳は アキュムレータ 演算の結果を保持する。 カウントレジスタ 転送や繰り返しの回数を勘定する。 データレジスタ メモリから読み出されたデータを一時的に保管する。 セグメントレジスタ メモリの番地を指定する。 フラグレジスタ 各種状態を表示する。「計算結果が正か負か」「計算結果 が桁あふれしていないか」などの状態を示す。 11 11 演算部 加算器を用いてデータの四則演算、比較、論理演算を行う。 加算器とビットのシフトで、かけ算を行う。 110101 ×) 1101 110101 110101 110101 1010110001 引き算は補数表現を用いる。 割り算は、引き算とシフトで行う。 プログラムカウンタ 今何番地の命令を実行しているのか、次に何番地の命令を実行すればよい かを CPU に示す。 12 12機械語レベルのプログラム
• 命令集合の並び • 命令集合:CPUで利用できる単純な命令群の 集合でメモリと演算レジスタを操作 – 命令コード:命令の種類を表す符合 • load, store など – オペランド:命令の付加情報 • アドレスAなど13 13
アセンブリ言語命令の例
種類 内容 意味 データ転送命令 load A store A アドレスAのデータを演算レジスタ(AC) に読み込む ACのデータをアドレスAに書き込む 計算命令 add A subtract A アドレスAのデータをACの値に加える アドレスAのデータをACの値から引く 分岐命令 jump A jumpzero A アドレスAにプログラムの実行を移す ACのデータが0の場合,アドレスAにプ ログラムの実行を移す その他 write halt ACのデータを出力する プログラムの実行を停止する 14 1から10までの和のプログラム アドレ ス 命令 意味 高水準言語 1001 load 2001 AC ← 2001 sum ← sum+1 1002 add 2002 AC ← AC + 2002 1003 store 2001 2001 ← AC 1004 load 2002 AC ← 2002 i ← i - 1 1005 subtract 2003 AC ← AC - 2003 1006 store 2002 2002 ← AC 1007 jumpzero 1009 条件分岐(ジャンプ) while i ≠ 0 1008 jump 1001 無条件ジャンプ 1009 load 2001 AC ← 2001 1010 write 結果の出力 write(sum) 1011 halt プログラム停止 2001 0 変数(結果) sum ← 0 2002 10 変数(i の初期値) i ← 10 2003 1 定数 1 分配則 ブール代数の計算規則 1=True(真), 0=False(偽) 1 + 1=1, 1 + 0=1, 0 + 1=1, 0 + 0=0 1・1=1, 1・0=0, 0・1=0, 0・0=0 y x y x∧ = ⋅ y x y x∨ = + 命題論理演算 xまたはyが true のとき true, x の否定 x, y がともに true のとき truey x∨ y x∧ ) ( ) ( ) (y z x y x z x∨ ∧ = ∨ ∧ ∨ x ) ( ) ( ) (y z x y x z x∧ ∨ = ∧ ∨ ∧ ) ( ) ( ) (y z x y x z x+ ⋅ = + ⋅ + ) ( ) ( ) (y z x y x z x⋅ + = ⋅ + ⋅ 論理変数 x = True (真) 1 False(偽) 0 16 16
x y NOT(x) AND(x,y) OR(x,y) NAND(x,y) NOR(x,y) XOR(x,y)
1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 7.2 論理変数と論理演算の真理値表 x
¬ xŸy x⁄y ÿ(x⁄y) ÿ(xŸy)
・ドモルガンの法則、分配則が成り立つ。 17 17
論理演算の書き方
論理式 ブール代数 MIL記法 • NOT(x) • AND(x,y) • NAND(x,y) • OR(x,y) • NOR(x,y) • XOR(x,y) • EQ(x,y) y x y x y x y x y x y x x ⋅ ⊕ + + ⋅ ⋅Three basic Boolean operations
x∧y=xy
x∨y=x+y‐xy
x=1‐x
例
x(x+y)=x(x+y‐xy)=x+xy‐xy=x
19 19 •論理演算を組み合わせ回路として実現する ことによって、加算機、フリップフロップなどが 構成できる。(テキスト p.164, p.170-171.) •論理演算は、論理変数と論理式によって与 えられる。 •半導体によって作られる基本素子は、NAND もしくは NOR である。それを組み合わせてほ かの AND, OR, NOT などの論理素子を構成 する。 •(NAND は完備生を持つ) 20 20
x
y
x・y
x
y
x+y
AND(x,y)
OR(x,y)
NAND 素子からほかの論理素子を作る(x・y) = x+y = x+y
21 21
x
y
NANDゲートでXORを作る
XOR(x,y) 22 (A) 半加算器 x +) y cout s (B) 1ビット全加算器 c_in x +) y cout s Å下からの繰り 上がり 下 の 桁 0 1 1 0 s 上 の 桁 1 1 1 0 0 1 0 1 0 0 0 0 cout y x 23モジュールによる演算回路の実現
1ビット半加算器モジュール x y s cout 1 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 s cout y x ) + 24 1ビット全加算機 (p.164) x y cin s1 c1 s c2 cout 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 c1 c2 s1 s 二つの入力ビットの加算 結果と桁上がりを出力命題1