特別実験 ALU テキスト
(最終改訂 2016/01/22 )
実験の目的
公開された最初の電子的情報処理装置である ENIAC は現在のコンピュータとは多くの面で異 なっており、「コンピュータ」の直系の祖先と言えるのは、CPU(Central Processing Unit:中 央処理装置)、メモリ、入出力装置のブロック構成によりプログラムもデータも実行時にメモリに 置かれるプログラム内蔵方式(stored program)を採用したM. WilkesのEDSAC(構想はALU を提唱したJ. von NeumannのEDVACの方が早かったが完成が大幅に遅れた。EDVACはプロ グラムカウンタも持たず直系とは言い難い)である。CPUはALU(Arithmetic Logic[al] Unit)、
制御装置、レジスタ群から成る文字通りコンピュータの中枢である。本実験では、コンピュータ の構成の内、制御装置のみを欠いた手動コンピュータ KM-38 を用いて制御装置の機能を人間が 代行することにより「万能アルゴリズム自動実行装置」たるコンピュータの動作原理について理 解を深めることを目的とする。制御装置も含めたKM-38シミュレータ(LabVIEWの実行ファイ ル)で簡単なプログラムを作成することにより、プログラム内蔵方式の本質に触れることも本課 題の目的とする。
参考資料
The ENIAC Museum Online
http://people.cs.nctu.edu.tw/~tsaiwn/introcs/00_CS2/07_Computer_History/ENIAC/50_UPe nn/02index.html
ENIACシミュレータ
http://zuse-z1.zib.de/simulations/eniac/eniac.jar (Java実行ファイル)
http://zuse-z1.zib.de/simulations/eniac/doc/virtualENIAC.pdf (マニュアル)
EDSAC 50周年記念ページ
http://www.cl.cam.ac.uk/events/EDSAC99/
EDSAC Simulator
http://www.dcs.warwick.ac.uk/~edsac/
実験ノート以外に用意するもの USBメモリ
事前準備
USBメモリに、本課題で使用する、ALU_KM38.zip(KM-38シミュレータ、簡易アセンブラ、
サンプルファイルを圧縮したもの:情報学実験のページからダウンロードする)を保存しておく。
実験手順の最後まで目を通し、全体の作業の流れと意味について理解しておくこと。
使用機器・部品類
手動コンピュータ KM-38(ALU実機)
情報科学研究教育センターパーソナルコンピュータ(KM-38シミュレータを実行する)
USB先バラケーブル(パーソナルコンピュータのUSBソケットからKM-38への給電用)
注意:本テキストでは「PC」は「パーソナルコンピュータ」ではなく、プログラムカウンタを意 味する。
使用ソフトウェア
LabVIEW2013(ランタイムエンジンの機能のみ使用)
KM-38シミュレータ(ALU_KM38.zipに含まれている)
表紙交付基準
本実験はレポートの提出を要せず、表紙を交付しない。
Ⅰ.実機操作編
実験装置概要
この実験で使用する手動コンピュータKM-38(KとMは設計を行った工学院大学、製作を担 当した丸和測器の頭文字である)は、コンピュータの基本構成であるCPU(ALU+制御装置+レ ジスタ群)、メモリ、入出力装置のうち、制御装置の部分だけを欠き、その機能を人間が操作代行 することによりコンピュータの動作原理の理解を図るもので、ここでは入出力装置も人間とのイ ンタフェースとして最小限必要な12個のトグルスイッチと4本のLEDアレイだけとなっている。
この目的のため、制御装置が単純となり動作原理を理解しやすい、固定長命令、語アドレス、
アドレス数 1、単一アキュムレータでアドレス修飾も無い(最初に動いたプログラム内蔵機であ るEDSACと同じ)アーキテクチャを採用している。すなわち;
○メモリの「番地」(address)付けの単位はオペランド(operand:演算操作の対象)の長さ である「語」(word:ここでは12ビット)
○命令語の長さは命令の種類にかかわらず一定で、オペランドと同じ長さ(ここでは12ビット)
○命令語の中で指定する番地は1個(1-address)だけ である。
メモリ上ではプログラムの最小単位である命令語もオペランドとなるべきデータも全て 0と 1 の並びであり、コンピュータが動くためにはこれらを識別して、順序通り正しく処理されなけれ ばならない。理解のポイントは、コンピュータの身になってどうしたら動けるか(命令語が順序 正しくその内容通り実行されるにはどの様な仕組があって、命令語にはどの様な情報が含まれて いなければならないか)を考えることである。まとめると以下の様になる。
1.命令語(KM-38では1語12ビット)に必要な情報とは:
●何をするか(動詞に相当:オペレーション)KM-38では上位4ビットで指定。
●何に対してするか(目的語に相当:オペランド)例えば加算の場合には操作対象である被加 数と加数の 2 個と結果である和の合計 3 個の格納場所を指定する必要があるが、被加数は CPUレジスタであるアキュムレータ(Accumulator:Accと略)に置き、結果もAccに置く と決めておけば加数の置かれたメモリ上の番地だけを指定すればよい(当然、被加数を事前 にメモリから Acc に移す命令と、結果を Acc からメモリに移す命令が別途必要である)。
KM-38では、下位8ビットを使用。
【まず「何をするか」を解読する必要があり、通常は上位(語の内容が命令ではなくデータで あるとき MSB のある側)にオペレーション情報が置かれる。一方、アドレスは符号無し整数
(自然2進)であり、そのLSBがデータのLSBと揃う様に右詰として下位に置くのが合理的 である。】
2.命令語を順序通り実行できるためには次に実行する命令の番地を保持し管理する仕組が必要:
●CPU レジスタであるプログラムカウンタ(Program Counter:PC と略。機械により Instruction Counter、PSW中のInstruction Address等とも呼ばれる。課題⑥アセンブラの
仮想計算機COMETⅡでは「プログラムレジスタ」と称しているが、一般的な名称は「プロ グラムカウンタ」である)に命令語の番地を格納しておき、命令を読み込んだらその値を更 新する【KM-38ではPC+1 ボタンを押す】。ジャンプ(分岐)の場合にはジャンプ先の命令 が格納されている番地をPCに格納すればよい【このためにKM-38にはPC loadボタンがあ る】。
3.CPUがメモリを利用できるためには番地を特定して読書きをする仕組が必要:
●メモリと CPUとの間では 1 ビットずつ読書きするわけではなく、番地付けの単位である 1 語ずつ転送されるのでCPUには、命令語、オペランドの各 1語分のバッファが必要で、こ の用途にCPUレジスタのインストラクションレジスタ(Instruction Register:IRと略)と Accが使われる。
●メモリ上の特定番地の内容を、命令語として利用するにはPC(KM-38では8ビット)の内 容、操作対象(または結果の格納場所)として利用するにはIR(ここに命令語の内容が格納 される)の下位8ビットをそれぞれメモリの番地として指定する。
【何れを用いてアクセスするかはG1スイッチでPCかIRかを選択し、命令語として利用す るにはIR loadボタン、操作対象として利用するにはAcc loadボタンを押してCPUレジス タに転送する。結果の格納については5を参照のこと】
4.ALUに所定の仕事をさせるためには:
●ALUは指定された演算を行うハードウェアで、KM-38では4ビットALUである74382(型 番は74LS382N)が3個使われ12ビットの演算ができる。命令語のオペレーション情報(実 験では4ビットに対してそれぞれ動作が定義されている。p.8表2後述)を人間が解読しス イッチ(S2,S1,S0の3個と最下位桁へのキャリー入力C0:名称は74382の規格に対応)を 切替えて各オペレーションに対応する動作をさせる。
●この機械では操作対象の一方も結果もAccに格納するので、Accへの転送元としてメモリと ALUの切替えが必要である。
【この切替えはG2スイッチを用いて、演算前にmem側でAcc loadを押して対象の一方を メモリからAccに格納し、演算後(すなわちS2,S1,S0,C0の設定後)にALU側でAcc load ボタンを押し、ALUの出力結果をAccに格納する】
5.プログラムとデータをメモリに設定するためには:
メモリには CPU と入出力装置が共にアクセスするので何れがアクセスするかを管理する必要 がある。KM-38では(入出力命令が無いので正式な入出力装置ではないが)入力装置は1語中の 各ビットに対応した12個のトグルスイッチ(D11~D0)、出力装置は各レジスタとメモリの特定 番地の内容を表示するLEDアレイである。writeボタンを押したときにG1スイッチで指定した レジスタの情報を用いた番地に書かれる内容は、G3スイッチ(onでDスイッチ、offでAcc)で 切替える。resetボタン(レジスタがクリアされるだけでメモリの内容はクリアされない)を押す とPCに0が入るのでG1スイッチをPC側にして「Dスイッチのセット、writeボタン押下、PC+1 ボタン押下」の繰返しで1語ずつ書き込める。命令語の実行過程でAcc上の演算結果をメモリに 格納するにはG1スイッチをIR、G3スイッチをoff(Accを選択)にしてwriteボタンを押す。
図1は手動コンピュータKM-38の外観で、左上電源端子右のIC1~IC3が各1,024ビットのメ モリで合計12ビット長256語、右下のIC27~IC29が3個の4ビット ALU(74LS382N)で、
全体で12ビットALUを構成する(p.6図6後述)。4本のLEDアレイはすべて12個のLEDか ら成るが、PCは8ビットのレジスタであり、図右上のPCの内容を表示するLEDアレイで橙枠 内の抵抗が実装されていない上位 4 ビット分は使用せず、右詰めで表示している。動作には 5V の直流電源が必要であり、USB先バラケーブルを用いてUSBソケットから供給する。
図1 手動コンピュータKM-38外観(橙枠内のLEDは使用していない)
KM-38 の電源端子、表示素子、押しボタン( )とトグルスイッチ( )の配置を図 2 に
示す。押しボタンとD11~D0以外のトグルスイッチは、人間が制御装置の機能を代行する操作部 分である。
図2 手動コンピュータKM-38 操作部分配置
図3は操作部分とメモリ、レジスタ、ALUの関係を示すブロック図で、ALUの操作対象の一 方はAccの内容(図4右の74382 OperationのA)、他方はG1で選択されたレジスタ(IRの場 合は下位8ビットの情報)で指定される番地のメモリの内容(74382 OperationのB)である。
図3 手動コンピュータKM-38 ブロック図
図4に、74382の機能とピン配置を示す。黄色の部分は、KM-38で設定している命令(p.8表 2後述)の実行では使用していない。
図4 4ビットALUの機能(National Semiconductor 74F382)
p.6 図5は 74382のゲート図で、ゲート数は桁上げ先見回路を持つ4ビット全加算器の2~3 倍程度である。
図5 4ビットALUのゲート図(National Semiconductor 74F382)
KM-38では、図6の様に3個の74382を接続して12ビットのALUを構成している。この様 な構成が可能であるのは負の整数の表現として2の補数表現を採用した場合に限られる。図のCIN、 SELECT、A0~A11、B0~B11、F0~F11がそれぞれKM-38のC0、{S2, S1, S0}、A入力、B入力、
ALU出力に対応する。
図6 3個の4ビットALUによる12ビットALUの構成
p.7表1は74382の真理値表の例である。真理値表は全ての可能な入力値の組合せに対して出 力値を定義するものであるが、ここではOVRとCn+4(算術演算以外ではdon’t careであり、半 導体製造メーカーにより結果が異なる)の特性を示すためのものとしており、表には入力A0~A3、 B0~B3がそれぞれ全て等しい(その値を An、Bnとしている)場合のみが掲げられている。表で Cnは桁上げ入力(KM-38ではC0に相当)、Cn+4は桁上げ出力(KM-38では表示できない)であ る。
表1 4ビットALUの真理値表(National Semiconductor 74F382)
KM-38は、制御装置を持たないが、p. 8図7の様に語のフォーマットを定め、p. 8表2の様に 機械命令を定義して、この内容の通り人間が操作を代行する。図 7 のビット位置(11~0:0 が LSB)は図1のデータ入力トグルスイッチD11~D0の番号に対応する。
11 10 9 8 7 6 5 4 3 2 1 0 operation (op. code) operand (address)
data (unsigned / signed)
図7 KM-38の命令語(上)と数値データ(下)の形式
表2 KM-38の機械命令一覧(赤字は実機には無いシミュレータでの拡張命令)
命令コード ニモニック 意味 動作
0000 NOP No OPeration no operation 0001 LDA LoaD Accumulator Acc ← mem 0010 STA STore Accumulator mem ← Acc 0011 ADD ADD Acc ← Acc+mem 0100 SUB SUBtract Acc← Acc-mem 0101 AND AND Acc ← Acc ∧ mem 0110 OR OR Acc ← Acc ∨ mem
0111 XOR eXclusive OR Acc ← Acc
⊕
mem 1000 JMP JuMP PC ← operand 1001 JEQ Jump if EQual zero if Acc=0 PC ← operand1010 JNE Jump if Not Equal zero if Acc≠0 PC ← operand 1011 JC Jump if Carry set if carry PC ← operand 1100 JS Jump if Sign negative if sign PC ← operand 1101 ADC ADd with Carry Acc ← Acc+mem+carry 1110 SBB SuBtract with Borrow Acc ← Acc-mem-borrow
1111 HLT HaLT halt
表2の動作欄の左向き矢印は代入を意味し、memは命令語の下位8ビットを番地とするメモリ の内容、operandは命令語の下位8ビットの内容である。この様に定義した命令の実行過程は以 下の通りである。
1.命令語をメモリからIRに読み込む(fetch cycle)
次に実行される命令の番地はPCに格納されているのでG1をPC側にしてIR loadボタンを押 す。このとき、IRのLED表示を見て上位4ビットの命令コード(op. code)が1111(HLT命令)
である場合は何もしないで終了する(註参照)。1111 以外であればPC+1ボタンを押して PCを 更新し解読実行に進む。
註:通常、メモリから命令語を読み込んだ段階でPCをインクリメントするが、HLT命令は特殊 でEDSACのZ(stop)命令と同じくPCを更新せず完了する(行き止まり)仕様としている。
2.IRに格納された命令語を解読実行する(execute cycle)
命令の対象の番地が命令語の下位8ビットに格納されているのでG1をIR側にする。表2に定 めた動作を(人間が制御装置の機能を代行して)行うため、IRのLED表示の上位4ビット(こ の段階では1111以外である)の命令コード(op. code)を見て、表3の通り、ALUの機能選択
(S2,S1,S0,C0 を設定)、ゲートスイッチの設定を行い、操作ボタンを押す。命令コードが 1001 と1010の場合にはAccのLED表示を12ビット数値として見て、それぞれ0の場合、0以外の 場合にPC loadボタンを押す。表のスイッチの設定欄で ”-” とあるものは何れに設定しても結 果に影響しないが、操作代行の趣旨からは、G1はIR側、G3はoff側にしておく。
表3 各命令の解読実行に対する設定と手動操作
op. code S2 S1 S0 C0 G1 G2 G3 KM-38操作
0000 - - - - - no operation
0001 - - - - IR mem - push Acc load
0010 - - - - IR - off push write
0011 0 1 1 0 IR ALU - push Acc load
0100 0 1 0 1 IR ALU - push Acc load
0101 1 1 0 - IR ALU - push Acc load
0110 1 0 1 - IR ALU - push Acc load
0111 1 0 0 - IR ALU - push Acc load
1000 - - - - - push PC load
1001 - - - - - if Acc=0, push PC load 1010 - - - - - if Acc≠0, push PC load
図7 および表2で定義したKM-38のフォーマットと機械命令に基づくプログラムを記述する のに各語(機械命令と数値データ)を12ビットの2進数で記述するのは実際的ではなく、課題⑥ アセンブラで見た様にオペレーションを操作の内容が分る略号であるニモニック(mnemonic)、
オペランド(課題⑥の COMETⅡと異なり KM-38 は単一アキュムレータで、この部分はメモリ の番地のみ)を変数名の様にラベル(label、symbolic address)で表したアセンブリ表記が便利 である。アセンブリ表記は、2 進データで表した機械語に翻訳するアセンブラ処理系を用意する のでなければ形式は(厳密に規定され解釈が一意に定まり曖昧さが無い限り)自由であるが、
ALU_KM38.zipに同梱の簡易アセンブラ(本テキスト末尾備考p.21 KM-38簡易アセンブラ概要 参照)で処理する場合の形式は次の通りである。
○ ラベルの最初の文字は英字でなければならない。Loop1、a2はよいが2a、100などは不可。
○ ラベルとデータまたはニモニックの間にはコロン(:)を入れる。
○ 注釈中の文字列を除き、すべて半角文字(1バイト文字)で書く。
○ ニモニックはすべて英大文字(例えばHltやhltではなくHLT)で書く。
○ データは十進数または等号(=)とする。十進数は4096で割った余り(例:-5と書いた 場合、4091)が使われる。等号を用いた場合、それが格納される番地自身を値とする。
○ データの前には、ラベルを省略した場合(配列的な使用の場合の先頭番地以外)にも必ずコ ロンを入れる。
○ セミコロン(;)および、その行のそれ以降の文字列は注釈として無視される。
○ ラベル(ラベルが無い場合にはニモニック)に先行する数字と空白は無視される。
p.10 図 8 は被乗数を単純に乗数回加算して積を求める(74382 の算術演算は加減算のみで
KM-38には乗算の命令が無い)プログラムの例である。シフトを用いて反復回数を乗数ではなく 語長である12回とするプログラムは命令を拡張したシミュレータでの練習問題とする。
図8 反復加算プログラム:アセンブリ表記(左) アセンブルリスト(右)
図8左のアセンブリ表記で黄色の部分は注釈、右のアセンブルリスト(簡易アセンブラの出力)
の各列は、左から順に機械語十進表現、アドレス十進表現、アドレス16進表現、機械語16進表 現、注釈を除いたアセンブリ表現である。アセンブルリストはこのままテキストファイルとして シミュレータの実行開始時に読み込ませて、青の機械語十進表現の列だけをシミュレータのメモ リに転送して利用できる(p.14メモリへのファイルからの転送 後述)。
実験手順
1.4ビットALU 74382の各機能を確認する。
ALUの各機能(p.5図4右)をp.8表2の機械命令の実行では使用していないものを含め、以 下の手順で確認する。S2, S1, S0(KM-38盤面のトグルスイッチの順序と図4右の機能表の順序 とは逆である)およびC0をセットし、D11~D0スイッチにセットしたAおよびBのデータ(こ こでは、2進データでAを010101010101、Bを000000111111とする)をAccおよびメモリに 格納し、演算結果をAccに格納して確認する。
① パーソナルコンピュータのUSBソケットにUSB先バラケーブルを挿し、KM-38の電源端子 +5V、GNDに給電する。
② resetボタンを押す。【PC、IR、Accはクリアされるが、メモリはクリアされない】
③ G3スイッチをonにする。【writeボタンを押したときD11~D0スイッチの設定内容がメモリ に書き込まれる】
④ 演算の種類に合せて、S2, S1, S0およびC0を設定する(上が1、下が0である)。C0は、加 算では0、減算では1とする(註参照)。その他の演算ではC0の設定は演算結果に影響しない。
⑤ G2スイッチをmem側(左側)にする。【Acc loadボタンを押したときAccにメモリの指定番 地(ここでは、PCもIRもクリアされているので、G1スイッチの設定に関らず0番地)の内 容が格納される.】
⑥ 第1の数(74382 OperationのA)をD11~D0スイッチ(上が1、下が0である)に設定す る。
⑦ writeボタンを押す。【D11~D0スイッチの設定内容がメモリの0番地に格納される】
⑧ Acc loadボタンを押す。【メモリの0番地の内容がAccに格納される】
⑨ 第2の数(74382 OperationのB)をD11~D0スイッチ(上が1、下が0である)に設定す る。
⑩ writeボタンを押す。【D11~D0スイッチの設定内容がメモリの0番地に格納される。この状
態でALUは演算結果を出力しているがKM-38では表示されない(表示できるのはレジスタの 内容のみ)。シミュレータでは常時ALUの出力を表示しており、この段階で結果を確認できる】
⑪ G2スイッチをALU側(右側)にする。【Acc loadボタンを押したときAccにALUの演算結 果が格納される】
⑫ Acc loadボタンを押す。【ALUの演算結果がAccに格納される】
⑬ AccのLED表示を実験ノートに記録する。
⑭ 8種類の演算(図4右のOperationで黄色の演算についても確認すること)を確認するまで、
別の演算を実行するため、④に戻る。
註:74382の減算機能は減数の各桁を反転して加算している(1の補数を加算)ため、C0を1と してLSBに1を加え2の補数の加算とする。
2.簡単なプログラムの命令語とデータをメモリに格納し実行する。
以下の手順でp.10図8の反復加算による乗算プログラムをKM-38のメモリに0番地から順に 書込んで内容を確認の後、手動操作により実行する。図8ではA番地(8番地)、B番地(9番地)
の値をそれぞれ10、100としているが、実験ではA番地には各自の学籍番号の右3文字(Jx14yyy のyyy)を十進数字とする十進数、B番地には2を格納する。
0番地から順に書込むには(KM-38に給電されているものとする)、
① resetボタンを押す。【PCがクリアされるのでPCの内容を番地としてメモリにアクセスすれ ば0番地から】
② G1スイッチをPC側にする。【メモリへのアクセスはPCの内容を番地として使用】
③ G3スイッチをonにする。【writeボタンを押したときD11~D0スイッチの設定内容がメモリ に格納される】
④ D11~D0スイッチにデータをセットする。
⑤ writeボタンを押す。【D11~D0スイッチの設定内容がPCの内容を番地としてメモリに格納 される】
⑥ PC+1ボタンを押す。
⑦ データが残っていれば④に戻る。
書込んだ内容を確認するには、
① resetボタンを押す。【PCがクリアされるのでPCの内容を番地としてメモリにアクセスすれ ば0番地から】
② G1スイッチをPC側にする。【メモリへのアクセスはPCの内容を番地として使用】
③ メモリのデータ出力LED(p.4図2のdata out)を読み取り確認する。
④ PC+1ボタンを押す。
⑤ データが残っていれば④に戻る。
0番地を開始番地として実行するには、
① resetボタンを押す。
② p.8の記述に従い命令語をメモリからIRに読み込む。
③ HLT命令であれば終了。
④ p.9の記述に従いIRに格納された命令語を解読実行する。
⑤ ②に戻る。
Ⅱ.シミュレータ操作編
シミュレータ概要
KM-38シミュレータはKM-38実機を使用する旧情報工学科の情報工学実験課題の「ALUの演 算動作」の内容の理解を助け作業の効率を上げる目的で予習・復習用として作られたもので、盤 面の体裁をLabVIEWのスイッチとLED表示によりKM-38実機そのままに動作を模倣する他、
ソフトウェアならではの機能を追加している。LabVIEW の実行ファイル(註)として作られて いるので、情報科学研究教育センターの演習室、カフェテリアの他、ランタイムエンジンをイン ストールした個人所有の PCで実行できる。図9はシミュレータ実行開始時の画面で、ウィンド ウには実機盤面相当部分のみが表示される。
図9 KM-38シミュレータのフロントパネル(実機盤面対応部分)
註:LabVIEW の表示窓の文字サイズとフォントの種類は OS の設定に従っておりアプリケーシ ョン側では変えられないため、ALU_KM38.zipには情報学実験Ⅰ課題④「LabVIEWによる論理 回路」のセグメントエディタと同様に異なるフォント設定に対応した 2種類の実行ファイルを用 意している。ALU_KM38_VDT.exeが仮想デスクトップ用、ALU_KM38_LPC.exeがLocal PC
用であり、ログイン OS により選ぶ。以下に掲載する画面(フロントパネルウィンドウ)は仮想 デスクトップで実行したものである。
図10はシミュレータ盤面の全体で、実機盤面相当部分の左にはメモリ内容の配列表示(十進お よび16進)、イベントログ(備考p.20シミュレータ補足2.参照)の2次元配列表示、シミュレ ータ起動時に読み込んだ機械語(TRANSFERを押すまではメモリに転送されない)、NOPとHLT の別解釈オプション(備考p.20シミュレータ補足4.参照)の設定スイッチがある。
図10 KM-38シミュレータのフロントパネル(全体)
図11にシミュレータのメイン VIのブロックダイアグラム(サブVIはここでは割愛する)を 示す。
図11 KM-38シミュレータのメインVIのブロックダイアグラム
実機に無くシミュレータに追加された機能で本課題の作業に関るものは以下の通りである。
1.スイッチの選択内容とALU演算結果の表示
ゲートスイッチ G1~G3 がそれぞれの設定位置により選択する対象とその値、ALU スイッチ S2~S0が選択している機能(「A MINUS B」など)とALUの演算結果を、それぞれゲートスイ ッチの傍らに対照して表示している。このため、実機では横位置となっている G2 を(これのみ
実機の忠実な模倣ではなく)縦に配置し、上をメモリ側、下をALU側としている。
アキュムレータ(ALUのオペランドA)とメモリ(ALUのオペランドB)との間の演算結果 は、実機の回路からは常時出力されているが表示として表には出していない。このため、ALUの 演算内容はG2をALU側に設定してAcc loadを押しアキュムレータ(Acc)に格納するまでは確 認することができない(人間が操作を代行することでコンピュータの動作原理を理解するにはこ の方が教育的と言える)。シミュレータではAcc loadを押す前にどの演算がなされ何が格納され るのかをあらかじめ見られる様にしてある。
レジスタの値の表示はその性質に即しており、アドレスを格納するプログラムカウンタ(PC)
では8 ビット符号無し整数、命令語を格納するインストラクションレジスタ(IR)では 12 ビッ ト全体、上位4ビット、下位8ビットをそれぞれ符号無し整数で表示し、上位4ビットについて はニモニックも併せて表示している。アキュムレータ(Acc)では(G3スイッチ右下のAcc欄も)、
符号無し整数、2の補数表現による符号付整数を表示している。
メモリのLED表示(data out)の上とG2スイッチ右上のmem欄には、G1で選択したレジ スタにより番地を指定されたメモリの内容をアキュムレータと同様に符号無し整数、2 の補数表 現による符号付整数で示している。G2 スイッチ右下のALU欄では演算結果をキャリー出力Cn
(p.16 4.キャリーフラグと命令の追加の項を参照)と符号無し整数、2の補数表現による符号 付整数で示している。
G3のデータ側にはD11~D0のトグルスイッチでセットされたデータを、符号無し整数、符号 付整数の他、命令語と解釈した場合の上位 4ビット(命令コード部分)が示すニモニックと下位 8ビットが示すアドレスとを分離して表示するので、writeボタンを押下してメモリに書込む内容 が命令語である場合に書込む前に容易にその内容を確認できる。
2.メモリへのファイルからの転送
長いプログラムをデバッグするとき、命令実行の自動化だけでなく、命令語とデータの書込み についても自動化が望まれる。シミュレータでは、実機と同様な操作で1語ずつ手動でメモリに 書込む他に、あらかじめテキストファイルに機械語のプログラムとデータを作り、これを起動時 にファイルから読取り、起動後にメモリに転送することができる。
シミュレータの起動時に「ファイルを開く」のウィンドウが開くので、0 番地から始まる機械 語のプログラムおよびデータの入ったテキストファイルを指定する。テキストファイルの内容は p.8図7の形式による各語の内容を、十進整数として1行に1個記述したもので、1行に複数の項 が空白で区切られて記述されている場合、第2項以降は無視される。例えば、p.10図8右の内容 のファイルを読込んだ場合、青の列の機械語部分だけが使用される。256 語に満たないプログラ ム、データでは 256 語分を全て書く必要はなく、256 行よりも短いファイルを読込んだ場合、0 番地から詰めて残りの要素には0が仮定される。
読込んだ内容はシミュレータ画面の左端に配列として表示されるがこの状態ではメモリの各語 には全て0が格納されており、配列ウィンドウの左側または正面にあるTRANSFERボタンを押 した時点でメモリに転送される。TRANSFER ボタンはシミュレータの実行中にどの時点で押し てもよく、再度押してメモリにリロードしてやり直すこともできる。p.15図12はALU_KM38.zip 内のsample_o.txtを読込んだ後、TRANSFERボタンを押した状態である。
シミュレータの起動時に読込むべきファイルが無い場合には、キャンセルをクリックしてその まま継続する。
図12 10×100を計算するプログラムをファイルから読込みメモリに転送した状態
3.自動実行
実機は、各トグルスイッチの切替えと押しボタンを人間が手動で操作することで、コンピュー タの命令実行過程での制御装置の働きと信号の流れを理解するために作られたものである。当然、
誤った操作をすれば正しい結果が得られない。
シミュレータでは、resetボタンの上にあるスイッチをAUTO側に設定すると、命令が正しく 処理された場合の結果が連続または1命令ずつ自動的に得られ、書込まれたプログラムとデータ が正しいかどうかをデバッグできる。CONTINUOUSボタンを押すと連続実行状態となり、HLT 命令に達するまで連続で命令を解読実行する。この場合、プログラムカウンタの値は255の次は 0に戻るのでメモリ中にHLT命令が無ければ停止することなく無限に続く(盤面正面のrun表示 LEDが点灯したまま)ことになる。
SINGLE/PAUSE ボタンはステップ実行と一時停止のボタンを兼ねており、連続実行時に押せ ば実行中の命令が終了時に停止、停止時に押せば 1命令実行して停止する。停止時に表示される PCの値は次に実行される命令が格納された番地を示し(HLT命令の場合、PCのインクリメント は行われず行き止まりなので「次に実行される命令」ではなくHLT命令が格納された番地を示す)、
IRの値は直前に実行された命令の内容、Accの値は最後にアキュムレータを書換えた命令の実行 結果である。
自動実行モードでのゲートスイッチの位置は自由である。G1 を IR 側にすれば、停止時に IR に命令語、メモリ欄にオペランドを同時に表示することができる。
p.16図13は、プログラムとデータをメモリに転送した図12の状態でAUTOスイッチをonに 切替え、10を100回加算して10×100=1000を計算した例である。黄枠の9番地(B)は0に なってループを脱し、青枠の11番地(S)には積の1000が格納されている。
図13 図12の状態でAUTOに設定して自動実行した結果
4.キャリーフラグと拡張命令の追加
実機では4ビットALU 74382を3個つなげて12ビットのALUを実現していることでもわか る様に回路中では 3個の ALUそれぞれの桁上げ入出力を使用しており、実機パネル上には表示 が無いが加減算では12ビットから上への桁上げ(LSBへの桁上げ入力C0から数えてC12に当 るがここではキャリー出力を Cn と書くことにする)が出力されている。シミュレータでは、ア キュムレータの拡張として加減算のキャリー出力を保持するキャリーフラグを設け、アキュムレ ータMSB左の「carry flag」欄に(自動実行のrun表示とcarry flagのLEDのみ赤LED)表示 している。ここで、G2スイッチ右下のALU欄のCnには、74382のキャリー出力そのものでは なく86系の定義でのキャリーを表示している(備考p.20シミュレータ補足3.参照)。自動実行 でキャリーフラグは加減算(追加されたキャリー付加減算を含む)以外では変更されず、手動操 作時も ALU 出力の Cn がキャリーフラグに格納されるのは(S2,S1,S0)が(0,0,1)、(0,1,0)、
(0,1,1)の場合のみである。追加された命令は以下の4種類で、これを用いるとビットローテー ト(p.18 ②参照)、2語長の加算などが構成できる。
拡張命令の手動実行時の設定と操作を p.17表4 に示す(CFはキャリーフラグ、┐は否定)。 ADC命令、SBB命令を手動で実行する場合は、加算のときキャリーフラグが1(キャリーあり)
の場合にC0を1、減算のときキャリーフラグが1(ボローあり)の場合にC0を0にする。
1011 Jump if Carry set(キャリーフラグが1の時に分岐する)
1100 Jump if Sign negative(アキュムレータのMSBが1の時に分岐する)
1101 ADd with Carry(キャリーフラグも加算してアキュムレータに格納する)
1110 SuBtract with Borrow(キャリーフラグも減算してアキュムレータに格納する)
表4 拡張命令の解読実行に対する設定と手動操作
op. code S2 S1 S0 C0 G1 G2 G3 KM-38シミュレータ操作
1011 - - - - - if CF, push PC load
1100 - - - - - if Acc MSB, push PC load
1101 0 1 1 CF IR ALU - push Acc load
1110 0 1 0 ┐CF IR ALU - push Acc load
実験手順
シミュレータ概要(pp.12-17)の記述に基づき(pp.2-10実験装置概要の理解は前提である)、 以下の①~③の何れかの課題についてKM-38シミュレータのプログラムを作成、実行し、結果を 確認する(必ず2例以上のデータについて確認し、考察すること)。実機操作編とは異なり時間外 にも作業が可能であり、できれば最終的に 3課題とも完成させることが特別実験の目的としては 望ましい。必要ならばALU_KM38.zip内の簡易アセンブラ(備考p.21 KM-38簡易アセンブラ概 要を参照)を利用のこと。
① 配列参照 解説
第二世代のコンピュータで指標レジスタ(index register)が導入され、これを用いたアドレス 修飾により構造をもつ記憶場所「配列」の実装が容易になった。稼動当初のEDSACと同様、KM-38 には指標レジスタが無いが、命令語のアドレス部分(下位8ビット)をプログラム実行時に書き 換えることでメモリ上の連続する番地のデータを配列要素の様に参照することができる。例えば、
図14の3つの命令はA番地の内容とB番地の内容の和をC番地に格納するプログラムであるが、
命令語であるL1番地、L2番地、L3 番地の内容を通常の数値データの如く扱い、下位8ビット をそれぞれ1だけ増やせば(下位8ビットに1を加えても255以下であるならば全体に1を加え て構わない)各操作対象(オペランド)が 1番地だけずれることになり、全体をループで反復す ることにより通常の配列操作と同じことが可能になる。
現在では、メモリ保護によりプログラム中の命令語を書換えることは少なくとも一般ユーザレ ベルではできないが、メモリ上でプログラムもデータも自由に書換えられることがプログラム内 蔵機(stored program computer)の本質であり、初期のコンピュータでは初歩的な手法であっ た。
L1:LDA A L2:ADD B L3:STA C
図14 メモリ上の2数の和を求め格納するプログラム
課題
1番地にa、2番地にbを格納した状態から開始して、順次3番地から10番地(データ部分を 先頭に置くのは、メモリをスクロールしなくても実行結果をシミュレータのフロントパネル上で 確認できる様にするためである)に前2個の要素の和を格納した状態で停止する機械語プログラ ムを作りなさい。たとえばa=6、b=8のとき、実行結果は3番地から10番地の内容が順に14、
22、36、58、94、152、246、398となる。データを先頭においたので、0番地には、プログラム の本体で最初に実行される命令が格納された番地へのジャンプ命令を格納しておくこと。
② 右ビットシフト 解説
KM-38はビットシフトの命令を持っていないが、1ビットの左シフトに限り2倍すなわち自分 自身を加算することで得られる。従って、これをk 回繰返すことにより、k ビットの左シフトが 実現されるが(もちろん除算命令も無いので)、右シフトを行うことはできない。
シミュレータではキャリーフラグ(74382のCn+4そのものではなく、一般的な86系のキャリ ー)の内容を含めて加算する ADC 命令が追加されており、自身を加算した後(このときアキュ ムレータのLSBは0となり、キャリーフラグには元のデータのMSBが入る)これを用いて0を 加算すると、左シフトで失われるMSBをシフトで空いたLSBに戻すローテートを実現できる。
図15のプログラムはA番地の内容を1ビット左ローテート(以下では、これを単にローテー トと呼ぶことにする)したものをA 番地に格納するものである。0は自分自身を減算することに よりプログラムの最初に生成して格納しておくことも可能であるが、ここでは定数として ZERO 番地に格納している。
LDA A ADD A ADC ZERO STA A : ZERO: 0
図15 1ビットの左ローテート
ローテートができればkビットの右シフトは12-k回ローテートした後、上位kビットが0で 残りのビットが1である数(例えばMASK番地に格納しておく)とAND命令で論理積を取るこ とで実現できる。MASK番地の内容を生成するには、1を初期値として左シフト(単純な2倍)
を12-k回反復して、最後に1を減算すればよい。反復回数が同じ12-kであるので、反復のル ープはローテートと共通に取ることができる。
課題
sを12ビットデータ、bを0以上12以下の整数とするとき、sをbビット右シフトした結果 をアキュムレータに格納した状態で停止する機械語プログラムを作りなさい。MASK番地の内容 もプログラムで生成すること。ただし、0とは異なり 1をプログラム中で無から生成することは できないので1は定数として(例えばONE番地に)格納しておく。
③ サブルーチン結合 解説
KM-38には、プログラムカウンタを退避したりスタックを操作したりするためのレジスタが無
く、したがってサブルーチンの結合を行う命令も無い。課題①「配列参照」では命令語の内容を 実行時に書換えることによりインデックスレジスタ無しに配列操作を実現したが、同様にサブル ーチン中に呼出側の戻り番地へのジャンプ命令をプログラム中で実行時に生成することにより p.19 図 16 の通り、通常の呼出しと戻りを実現できる。サブルーチンにパラメータがある場合に は、呼出し前にサブルーチンが使用する番地に格納しておけばよい。
CALL:LDA CALL ← 命令語自身をアキュムレータに格納する JMP SBR ← サブルーチンの先頭番地に分岐する ・・・・・ ← サブルーチンからはここに戻る :
SBR: ADD K ← サブルーチンの先頭:呼出し元に戻る命令を生成する STA RTN ← 生成した命令をRTN番地に格納する
:
サブルーチン本体 :
RTN: ・・・・・ ← ここに呼出し元への無条件ジャンプ命令が書込まれる
K : {ある定数} ← この定数が本課題のポイント 図16 Wheeler jump
命令語LDA CALLの内容を符号無し整数と解釈したとき、これに加算してオペレーション部 分(上位4ビット)がJMP 命令の(1000)2、アドレス部分が戻る先のCALL番地+2となる定数 をK番地に格納しておけばよい。これが最初に動いたプログラム内蔵機EDSACでサブルーチン を実現したWheeler jumpと呼ばれる手法である(EDSACの加算命令では加数をメモリのアド レスでなく値として書けるので図16とは少し異なる)。呼出し元に戻るための分岐命令を実行時 にメモリ上に作り付ける手法は、浮動小数点演算の高速化に特化しサブルーチン結合に虎の子の レジスタを使用したくない CDC6600(後に「最初のスーパーコンピュータ」と呼ばれた)でも 用いられている。
課題
A番地の内容とB番地の内容との和をC番地に格納するサブルーチンを作り、A番地にa、B 番地にbを格納してこれを呼出し、戻った後C番地の内容をアキュムレータに表示して停止する 機械語プログラムを作りなさい。a、bは(値を適当に決めてよいが)最初からA番地、B番地 にデータとして格納するのではなく、パラメータとしてサブルーチンに渡す(プログラム中で別 の番地に格納されたものを、サブルーチン実行前に呼出し側でLDA命令とSTA命令とを用いて A、B番地にそれぞれ格納する)こと。
備考
シミュレータ補足
以下に、本実験課題の学修には必ずしも必要ではない情報としてシミュレータ概要では割愛し た事項について記す。
1.仕様上の制限
LabVIEW の画面(フロントパネル)では入力系は制御器、出力系は表示器と機能が分れてお
り、制御器であるトグルスイッチはサブVIとして呼ばれた場合を除き、マウスカーソルを合せて クリックする以外には状態を変更することができない。このため、自動実行時にフェッチ、エグ ゼキュートのフェーズ、命令の内容により、画面上でゲートスイッチ、ALUスイッチの設定が動 いて切替ることはない。
自動実行時に表示を読む PAUSE 状態では PC が示す番地の命令をフェッチする前なので、
ALU の設定は本来未定義状態である。また、ALUの設定スイッチをプログラムから動かすこと ができないことから、自動実行時に表示された設定位置での機能(p.16図13の例ではCLEAR)
と異なる演算結果が ALU の値として表示されることには問題が多い。したがって、自動実行時 にはALUのfunction欄にはAUTOMATIC、値はCnを含め常に0を表示することとしている。
74382の論理演算では、don’t careを利用している関係で算術演算以外では0であるべきCn(p.7 表1の記号ではCn+4)に本来の論理とは無関係な値が出力されている。シミュレータではこの様 な無意味な出力までも模倣することはしていない。
2.イベントログの記録と保存
実機での作業の予習・復習用に導入した機能で、手動操作で正しい結果が得られなかったとき に行った操作をトレースしてデバッグ(保存したログファイルを編集して手動操作で書込んだメ モリの内容を求めることも可能である)することができるが本課題でのシミュレータ編の操作で は使用しない。盤面のreset, write, PC+1, PC load, IR load, Acc loadの6個のボタンを押したと き、押したボタンの種類(順に32, 16, 8, 4, 2, 1と番号を付す)と押す直前のトグルスイッチの 設定、レジスタ内容、メモリ内容(G1で選択されたレジスタの値が示す番地の内容)をログとし て2次元の配列で(画面のウィンドウからはみ出す部分は配列の指標を直接指定、あるいは増減 ボタンのスクロールで)表示する。
各行の内容は、左から押したボタンの種類、ゲートスイッチ設定(スイッチの状態を、上を1、
下を0としたときの (G1,G2,G3)2の値)、PC、IR、CF/Acc(CF×4096+Acc:CFはキャリーフ ラグ)、メモリ、データスイッチ設定、ALU スイッチ設定(((S2,S1,S0)2の値)、C0 である。ボ タンを押すごとに配列に要素が追加される。
このログは終了時に SAVE ボタンを押すと「書込むファイルを選択。」のウィンドウが表示さ れ、指定した名前のテキストファイルに保存できる。このログを見れば、どの様な設定でどのボ タンを押しその結果各レジスタとメモリの値がどの様に変化したかを追跡できる。最後に押され たボタンによるレジスタとメモリの値の変化をファイルに残すため、ダミーのイベント(ログで はボタンの種類欄には0が記録される)が追加される。ログファイルが不要な場合は、キャンセ ルを押すか、又はSAVEを押さないで、直接右上の閉じるボタンを押して終了する。
3.キャリーフラグ補足
74382での減算はC0を1にして2の補数の加算すなわち1の補数の加算に更にLSBに1を加 えることから(従って0-0でもキャリーが発生する)、キャリーを含めた結果は自然2進表現で 見れば4096だけ大きな値となり、被減数のMSBの上に1を仮定し(とりあえず借りておく)こ れを含めた減算を行っていることになる。したがって結果のキャリーが1ということは「借りた けど使わないで残っている」ことを意味し、ボローが発生していないことを示す。この表示は Apple Ⅱが採用した6502と同じで86系とは逆になる。利点として定数の0だけでなく1もプロ グラム中で作り出すことができるが、キャリー付加減算でこれをそのまま用いることは誤解を招 きやすい。ここではキャリーとしてより一般的な 86 系の定義に合せたものを ALU 演算結果の Cnに出力し加減算(キャリー付加減算を含む)ではこれをキャリーフラグに格納している。
4.NOPとHLTの別解釈オプション
KM-38のHLT命令はEDSACのZ(stop)命令を模しているが、同じ固定長命令、語アドレス、
アドレス数1の代表的なアーキテクチャであるIBM70シリーズの停止命令ではHTR(Halt and TRansfer:コンソールの Start を押したときにオペランド部で指定した番地から再開する)と HPR(Halt and PRoceed:停止番地の次の番地から再開する)が用意されていた。シミュレータ では KM-38実機の既存の命令をこの形に解釈するオプションとしてフロントパネル左下に 2 個 のトグルスイッチHTR、HPRを設けている。スイッチは独立で、HTRをonにしたとき、HLT
をHTRの様に(但し、シミュレータではPCにオペランドを格納して停止するが、IBMのHTR では停止時にはPCは更新されず、Startを押した時点でアドレス部を格納してジャンプ先から実 行する)、またHPRをonにしたときNOPをHPRの様に(これはIBMもPCを更新して停止)
解釈する。HTRオプションの自動実行ではHLT命令でPCは(HLT命令の格納番地ではなく)
0 になっているため、AUTO(を off にして reset を押下することなく)のままで停止時に TRANSFERを押下して0番地から再実行が可能である。HPRオプションは、(SINGLE/PAUSE によるデバッグが煩雑な場合)NOPを連続実行時のブレークポイントとして利用できる
KM-38簡易アセンブラ概要
シミュレータ操作編の課題は、シフト、指標付けなど基本的な処理を行う機械語プログラムを テキストファイルに格納し、これを ALU シミュレータで読込み自動実行して結果を確認するも ので、実機操作編と同様にニモニックとラベルを用いて書いたアセンブリ語によるプログラムを 手作業で機械語のコードに翻訳する作業(ハンドアセンブル)を含んでいる。
ハンドアセンブルの作業量は限られたものであり、本実験の目的である「コンピュータの動作 原理について理解を深める」ためには必要な作業であるが、初歩的なエラーで時間を空費するこ とは避けるべきであり、できるだけ効率よく実験を進めるため、簡易アセンブラ(情報工学実験 当時にフリーソフトで利用できる言語処理系は限られており、「(仮称)十進BASIC」で書かれて いる。機能は機械語への翻訳とラベルの重複、未定義、ニモニックの綴り間違いといった簡単な エラーの検出に止め、翻訳時の先頭番地の指定等はできない)を用意した。これを使用する場合 には、p.9に記述した形式でアセンブリ語のソースプログラムをテキストファイルとして作成する。
アセンブルの実行方法は次の通りである。
① ALU_KM38.zipを解凍してBASICw32フォルダ中のBASIC.EXE(「(仮称)十進BASIC」
処理系の実行ファイル)を開く。
② (仮称)十進BASICの「ファイル(F)」メニューの「開く(O)」(またはAlt+F、O)で、簡易 アセンブンラKM38_asm.basを選ぶ。
③ (仮称)十進 BASIC の「実行(R)」メニューの「実行(R) F9」(または F9)をクリック して簡易アセンブラを実行する。
④ ソースプログラム名の入力ウィンドウにファイル名(例:sample.txt)を入力する。BASIC.EXE と同じディレクトリにある場合は拡張子.txt を省略できる。別ディレクトリにあるファイル で.txt を省略した場合には空ファイルとして処理するためコードファイルが空になる。
BASIC.EXEとは別ディレクトリにあるソースプログラムは、../ex.txt(BASICw32の上位ディ レクトリにあるex.txt)、../srce/ex2.txt(BASICw32と同位に置かれたsrceディレクトリにあ るex2.txt)の様に指定する。
⑤ コードファイル名の入力ウィンドウにテキストファイル名(例:sample_o.txt)を入力する。
BASIC.EXE と同じディレクトリに作る場合は拡張子.txt を省略できる)別ディレクトリに作 るファイルで.txtを省略した場合には拡張子無しのファイルが生成される。ALU_KM38.zip中 のsample_o.txtは、”../sample_o.txt”と入力してBASICw32の上位ディレクトリに生成したも のである。
実行中のウィンドウには、ソースプログラムにエラーがあればその内容、なければ"Assembled successfully."と出力されて終了する。p.22図17は、着色が無いことを除きp.10図8と同じもの である。
図17 ソースsample.txt(左)とコードsample_o.txtの内容(右)
コードファイルに出力される各行の内容は、機械語コード(十進数)、アドレス(十進数)、ア ドレス(16進数)、機械語コード(16進数)、ソース(注釈を除いたもの)、エラーの内容(エラ ーがある場合)である。図18はエラーのあるソースプログラムの例、図19はこれをアセンブル した出力である。
図18 エラーを入れたソースプログラムの例
図19 図18のソースプログラムを処理した出力