1.07k likes | 1.22k Views
H2 :マイクロプロセッサ. 岡本 吉央. 日程. 第1回 イントロダクション マイクロ動作の理解. 第2回 基本プログラミング (2 バイト乗算 ). 第3回 応用プログラミング ( 図形描画 ). 第4回 応用プログラミング ( メロディー出力 ). コンピュータの利用. ユーザ. 入力. どのような仕組みで動いているのか ?. 出力. コンピュータ. コンピュータ・ハードウェア. 記憶装置. 入力装置. 処理装置. 出力装置. コンピュータ・ソフトウェア. 記憶装置. 入力装置. アプリケーションプログラム.
E N D
H2:マイクロプロセッサ 岡本 吉央
日程 第1回 イントロダクション マイクロ動作の理解 第2回 基本プログラミング (2バイト乗算) 第3回 応用プログラミング (図形描画) 第4回 応用プログラミング (メロディー出力)
コンピュータの利用 ユーザ 入力 どのような仕組みで動いているのか? 出力 コンピュータ
コンピュータ・ハードウェア 記憶装置 入力装置 処理装置 出力装置
コンピュータ・ソフトウェア 記憶装置 入力装置 アプリケーションプログラム システムプログラム 処理装置 出力装置
疑問 • 処理装置 (CPU) はプログラム(≒ソフトウェア)をどのように解釈しているのか? 高級言語による プログラム 機械語による プログラム
(今のところの) 回答 • コンパイラ,アセンブラと呼ばれるプログラムを変換するプログラムを使う コンパイラ アセンブラ 高級言語による プログラム 機械語による プログラム アセンブリ言語に よるプログラム
コンパイラ アセンブラ 高級言語による プログラム 機械語による プログラム アセンブリ言語に よるプログラム ことばの整理:機械語 • CPUが直接理解し実行できる言語のこと • プログラムは0と1の列から構成される • CPUごとに異なる
コンパイラ アセンブラ 高級言語による プログラム 機械語による プログラム アセンブリ言語に よるプログラム ことばの整理:高級言語 • 人間が使いやすいプログラミング言語 • C,C++,Java,Perlなど • CPUごとに異ならない
コンパイラ アセンブラ 高級言語による プログラム 機械語による プログラム アセンブリ言語に よるプログラム ことばの整理:アセンブリ言語 • 機械語を人間にわかりやすくした言語 • 命令が機械語と (ほぼ) 1 対 1 に対応 • CPUごとに異なる
コンパイラ アセンブラ 高級言語による プログラム 機械語による プログラム アセンブリ言語に よるプログラム ことばの整理:コンパイル • 高級言語によるプログラムをアセンブリ言語によるプログラムに(または機械語によるプログラムに)翻訳すること
コンパイラ アセンブラ 高級言語による プログラム 機械語による プログラム アセンブリ言語に よるプログラム ことばの整理:アセンブル • アセンブリ言語によるプログラムを機械語によるプログラムに翻訳すること
逆アセンブル コンパイラ 高級言語による プログラム 機械語による プログラム アセンブリ言語に よるプログラム ことばの整理:逆アセンブル • 機械語によるプログラムをアセンブリ言語によるプログラムに翻訳すること
この実験の流れ • アセンブリ言語によるプログラミング • 作成したプログラムのアセンブル(手作業) • 実行
コンピュータ・ソフトウェア 記憶装置 入力装置 アプリケーションプログラム システムプログラム 処理装置 出力装置
この実験で用いるハードウェア • KUE-CHIP2 • 教育用の8ビットマイクロプロセッサ • マイクロプロセッサ ≒ CPU
KUE-CHIP2の各部:バス • 入力バス:入力部分とCPU内部を結ぶ • 出力バス:出力部分とCPU内部を結ぶ
KUE-CHIP2の各部:ALU • Arithmetic and Logic Unitの略 • 演算論理装置 • 算術演算,論理演算,アドレスの計算を行なう
KUE-CHIP2の各部:ACC • アキュムレータ (accumulator) • 演算に利用するレジスタ.8ビット • 演算対象,演算結果を保持
KUE-CHIP2の各部:IX • インデックスレジスタ (index register) • 演算に利用するレジスタ.8ビット • 演算対象,演算結果を保持 • 修飾アドレス指定のときのアドレス修飾にも使用
KUE-CHIP2の各部:FLAG • フラグレジスタ (flag register) • 演算・シフト結果により変化.4ビット 桁上がりフラグ 桁あふれフラグ 負フラグ ゼロフラグ
KUE-CHIP2の各部:PC • プログラムカウンタ (program counter) • 次に実行する命令のメモリ上でのアドレスを保持.8ビット
KUE-CHIP2の各部:MAR • メモリアドレスレジスタ • メモリ操作の対象とするアドレスを保持.8ビット
KUE-CHIP2の各部:IR • 命令レジスタ • メモリから読み出した命令を保持.8ビット
KUE-CHIP2の各部:内部メモリ • 512バイト.バイト単位の番地指定 • プログラム領域:0~255番地プログラムまたはデータの格納 • データ領域:256番地~511番地データの格納
KUE-CHIP2でのプログラミング • 独自のアセンブリ言語で行なう • プログラムはメモリのプログラム領域に置かれる (プログラム内臓方式) • 0番地に置かれた命令から順番に実行される
KUE-CHIP2のアセンブリ言語 • 命令:1バイトか2バイト • 命令の種類:p16,表1を参照 • 言語仕様:附録Aを参照
プログラム例 (p23,リスト2) アドレス データ 命令 オペランド 00: 0110 001- 0000 0001 LD ACC, 01h 02: 0001 0--- OUT 03: 0100 0111 RLL ACC 04: 0011 0000 0000 0010 BA 02h 「01」という値をACCに格納する ACCの内容を出力バッファ(OBUF)に出力する ACCの内容を論理左回転し,ACCに入れる 常に02番地へ戻る 機械語による プログラム アセンブリ言語による プログラム アセンブラ
アセンブルの方法 (1/4) • p29,A.2 命令セットを参照 • 「LD ACC,01h」のアセンブル 0 1 1 0 0 0 1 - 0 0 0 0 0 0 0 1 A B
アセンブルの方法 (2/4) • p29,A.2 命令セットを参照 • 「OUT」のアセンブル 0 0 0 1 0 - - -
アセンブルの方法 (3/4) • p29,A.2 命令セットを参照 • 「RLL ACC」のアセンブル 0 1 0 0 0 1 1 1 A s m
アセンブルの方法 (4/4) • p29,A.2 命令セットを参照 • 「BA 02h」のアセンブル 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 c c
アドレス データ 命令 オペランド 00: 0110 001- 0000 0001 LD ACC, 01h 02: 0001 0--- OUT 03: 0100 0111 RLL ACC 04: 0011 0000 0000 0010 BA 02h プログラム例 (p23,リスト2) 「-」は0か1で置き換える (どちらでもよい)
アドレス データ 命令 オペランド 00: 0110 0010 0000 0001 LD ACC, 01h 02: 0001 0000 OUT 03: 0100 0111 RLL ACC 04: 0011 0000 0000 0010 BA 02h プログラム例 (p23,リスト3) アセンブル完了
プログラムの実行 • 第2.5節に沿って行なう (p.21~25) • 注意:実行前にはRESETを押すこと • 全員行なったら次の説明...
今日の実験内容 • 命令がどのように実行されているか理解する • フラグの働きを理解する
命令はどのように実行されるか? • クロックに沿って実行 • クロック1周期分 → 1つの実行フェーズ • KUE-CHIP2での命令の実行:各命令は3から5フェーズで実行 • P0,P1:各命令共通 • P2以降:各命令相違 p17,表2を参照
各フェーズの動作:P0 • メモリのプログラム領域から次に実行する命令を取り出す準備 • 次に実行する命令の場所はPC (プログラムカウンタ) が示す • 実際の動作: • (PC)→MARPCの内容をMARに転送 • PC++PCの内容を1増やす
各フェーズの動作:P1 • 命令を読み込む • 実際の動作: • (Mem)→IR:MARの内容を番地とするメモリの 内容が命令レジスタに転送される
各フェーズの動作:P2 • 命令レジスタに読み込んだ命令を命令デコーダが解読し,命令に応じた処理を行なう • 2バイト命令であると分かった場合,命令の2バイト目を読む準備をする p17,表2を参照
実際に見てみる:リスト1 (p 18) アセンブル結果の16進表示 プログラムの実行を停止する メモリ80番地の内容を03とし, メモリ81番地の内容をFDとする メモリのプログラム領域D2番地の 内容とACCの内容を加算する メモリのプログラム領域D1番地の 内容をACCに格納する メモリのプログラム領域ANS番地にACCの内容を格納する 「D1」を見たら「80h」だと思う (変数宣言,初期化のようなもの)
実行のトレース LD ACC,[D1] p17,表2を参照 A B Bの部分
実行のトレース LD ACC,[D1] 00 00 000: 64 001: 80 002: B4 ... 080: 03 081: FD 00 00 00 00
実行のトレース LD ACC,[D1] P0: (PC)→MAR, PC++ 00 00 01 000: 64 001: 80 002: B4 ... 080: 03 081: FD 00 00 00 00
実行のトレース LD ACC,[D1] P1: (Mem)→IR 01 64 00 000: 64 001: 80 002: B4 ... 080: 03 081: FD 00 00 00 00
実行のトレース LD ACC,[D1] P2: (PC)→MAR, PC++ 01 64 02 000: 64 001: 80 002: B4 ... 080: 03 081: FD 00 00 00 00 01
実行のトレース LD ACC,[D1] P3: (Mem)→MAR 64 02 000: 64 001: 80 002: B4 ... 080: 03 081: FD 00 00 00 01 80
実行のトレース LD ACC,[D1] P4: (Mem)→A 64 02 000: 64 001: 80 002: B4 ... 080: 03 081: FD 00 00 00 03 80
今日の実験の内容 (1) • フェーズごとの動作 (マイクロ動作) を実際に追跡 (トレース) する • リスト1を使用