%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
% COMET IIのハードウェアー
% last updated 2005.11.17
%    created by  Masashi Yamamoto
%     e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,float}
\usepackage{html, listings, jlisting}
%
\oddsidemargin 0mm  %左の余白 25.4mm-0mm　奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm　偶数ページ
\textwidth 160mm
%
%
\newcommand{\command}[1]{「\texttt{#1}」}
\newcommand{\cl}[1]{\texttt{#1}}
\newcommand{\tw}[1]{\texttt{#1}}
%
\newcounter{toi_num}
\newcommand{\toi}{\textbf{\texttt [問\arabic{toi_num}]}
   \addtocounter{toi_num}{1}}
\newcommand{\qbox}[1]{
    {\fboxsep=2pt\fboxrule=0.4pt\fbox{\hspace{3mm}{#1}\hspace{3mm}}}
}
%
\lstdefinelanguage{CASL2}{
morekeywords={START,END,DS,DC,OUT,RPUSH,RPOP,LD,ST,LAD,%
ADDA,SUBA,SUBL,AND,OR,XOR,CPA,CPL,SLA,SRA,SLL,SRL,%
JPL,JMI,JNZ,JZE,JOV,JUMP,PUSH,POP,CALL,RET,SVC,NOP,%
GR0,GR1,GR2,GR3,GR4,GR5,GR6,GR7},%
morecomment=[l]{;},%
morestring=[b]",%" 
}
%
\renewcommand{\lstlistingname}{リスト}
\lstset{language=CASL2,%
        basicstyle=\footnotesize,%
        commentstyle=\textit,%
        classoffset=1,%
        keywordstyle=\bfseries,%
	basewidth={0.8em,0.55em},%
	frame=tRBl,framesep=5pt,%
	showstringspaces=false,%
        numbers=left,stepnumber=1,numberstyle=\footnotesize%
	}%
%
\begin{htmlonly}
\usepackage{verbatimfiles}
 \providecommand{\lstinputlisting}[2][]{\verbatimlisting{#2}}
\end{htmlonly}
%
%
\begin{document}
\title{COMET IIのハードウェアーとマシン語}
\date{2005年1月18日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{これまでの復習と本日の内容}
%=====================================================================
%---------------------------------------------------------------------
\subsection{先週の復習}
%---------------------------------------------------------------------
先週までは，CASL IIで取り扱うデータ，整数と文字のメモリーの格納の仕方を学習した．
CASL IIで取り扱うデータは，整数と文字だけなので，これでデータの取り扱いは理解し
たはずである．実際のコンピューターはもっと複雑なデータを扱っているが，基本的には
これまで学習した整数や文字の扱いと同じである．

コンピューターの内部では全ての情報をコード化して取り扱っていることを理解しなくて
はならない．コンピューターでは，ビットパターンで全ての情報はコード化される．驚く
ことに，コンピューターが処理する対象は，ビットパターンのみなのである．複雑な情報
処理をしているように見えるが，ビットパターンを変化させているだけである．

このビットパターンは，2進数と1対1の対応する．すなわち，整数で表現できることにな
る．コンピューターに取って都合の良いビットパターンは人間が紙を使って表現するのは
不便なので，16進数の整数で表されることが多い．

これで，諸君は世界中のコンピューターでの情報の取り扱い方法を学んだことになる．情
報をコード化する方法は，仕様書に書かれているので，それを見れば分かる．音や絵など
さらに複雑な情報も，同じである．
%
%---------------------------------------------------------------------
\subsection{本日の内容}
%---------------------------------------------------------------------
本日は，教科書のp.15〜24について学習する．主な内容は，
\begin{itemize}
 \item レジスターを中心としたCOMET IIのCPUについて
 \item 命令をメモリーに格納する方法について
\end{itemize}
である．
%
%=====================================================================
\section{レジスター}
%=====================================================================
%---------------------------------------------------------------------
\subsection{レジスターとは何か}
%---------------------------------------------------------------------
コンピューターは，おもに計算をするCPUとプログラム(命令とデータ)を格納するメモリ
から構成される．CPUとメモリーの間で，命令やデータをやりとりして，プログラムを実
行する．

計算を司るCPUの中にも，容量は小さいながらもレジスターと呼ばれる記憶装置がある．
計算をするためにはある程度の記憶が必要である．教科書を読み理解するときの人間の動
作を考えると分かりやすい．この場合，教科書がメモリーで脳がCPUに対応する．内容を
理解するためには単語を一時的に記憶しているはずで，その記憶する場所がレジスターと
考えればよい．

ここで，第一回の講義で述べたコンピューターの原理を示すチューリングマシーン(図
\ref{fig:Turing_machine})について，思い出して欲しい．明らかに，書き換え可能なテー
プがメモリー，オートマトンがCPUを表している．オートマトンの中にあり，内部状態を
表すものがレジスターである．
\begin{screen}
 CPU内にある小さな記憶装置がレジスターである．ここにはCPUで計算するデータや計算
 結果を一時的に記憶する．
\end{screen}
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.9]{figure/Turing_machine.eps}
  \caption{チューリング機械}
  \label{fig:Turing_machine}
 \end{center}
\end{figure}
%---------------------------------------------------------------------
\subsection{コンピューターはどのようにプログラムを実行するか}
%---------------------------------------------------------------------
以前述べたように，コンピューターのプログラムはデータと命令から構成される．この命
令とデータは，実行時に主記憶装置(メインメモリ)に格納される\footnote{この格納の動
作をロードと言う．}．CPUと主記憶装置は，図\ref{fig:CUP_memory}のような関係になっ
ている．CPUは主記憶装置のアドレスを指定することにより，主記憶装置に格納されてい
るデータを取り出す．そして，それはレジスタに記憶し，その中身に従い，処理する．処
理された結果ももちろん，レジスタに記憶する．レジスタの中身を主記憶装置に戻すこと
により，データの加工が完了する．

ここで，諸君が使っている実際のコンピューターでのプログラムの動作順序を示しておく．
%
\begin{enumerate}
 \item{補助記憶装置(ハードディスク等)からプログラムがメインメモリーにロードされ
      る．この指令は，Operating System(OS)が出す．}
 \item{メインメモリーに格納されたプログラムの指示に従い，CPUが動作する．その動
      作は，
      \begin{enumerate}
       \item CPUがメインメモリーから命令を取り出す．命令を取り出すアドレスは，
	    CPUのプログラムレジスタに書かれている．
       \item 取り出した命令は，CPU内の命令デコーダーが内容を解析する．
       \item 解析された命令は，論理演算装置(ALU:arithematic logic unit)が
	     処理(計算)する．
       \item 各種のレジスターに処理の結果が格納される．
       \item プログラムレジスタの値を再設定する．
       \item 以上の動作をプログラム終了まで繰り返す．
      \end{enumerate}
      である．}
\end{enumerate}
%
\paragraph{注意}CASL IIの学習で1の補助記憶装置からメインメモリーへのロードは学習
の範囲外である．以降の講義では，2の動作について学習する．

このプログラムの実行方法からも，CPUの中にもデータを記憶する装置(レジスター)が必
要な理由が理解できるであろう．ところで，ここでプログラムレジスタという訳の分から
ないもが使われていることに気づく．これも教科書の読むときの動作を考えると分かりや
すい．プログラムレジスタは，脳の中に記憶される教科書のページ番号だと思えばよい．
どこまで読んだか憶えていて，そのページを読んだら次のページをめくるのである．

わざわざCPU内に作らなくても，メインメモリーの一部を使えば良いのでは，と考える人
もいるであろう．それでもコンピューターは可能であるが，今よりも複雑になるだろう．
また，CPU とメモリーのデータの間でのデータの交換回数が極端に増加して，動作が遅く
なるに違いない．

レジスタもデータなどを蓄えるので，メインメモリー同様，記憶装置の一種である．しか
し，以下のような違いがある．
%
\begin{itemize}
 \item{主記憶装置}
      \begin{itemize}
       \item CPUとは独立である．
       \item プログラム(命令とデータ)を格納する．
       \item 記憶容量が大きい．COMET IIの場合，1ワード(16ビット)のデータを65536
	     個，記憶できる．
       \item 番地を指定して目的のデータにアクセスする．
      \end{itemize}
  \item{レジスタ}
      \begin{itemize}
       \item CPUの構成部品のひとつである．
       \item データを処理するための一時的な記憶場所である．また，処理結果も記憶
	     する．
       \item 記憶容量が小さい．COMET IIのようなものだと，1ワード(16ビット)のデータ
	     を20〜30個程度で済むであろう．
       \item 名前を指定して，目的のデータにアクセスする．
       \item 現実の装置の場合，CPUのデータのアクセススピードは，レジスターの方が
	     はるかに早い(C言語ではレジスタを使ったプログラムができる)．
      \end{itemize}
\end{itemize}

要するに主記憶装置は，いろいろなデータ(命令もデータの一種と考える)を蓄えるファイ
ルキャビネットのようなものである．一方，レジスタは，実際にCPU がデータを加工すると
きに一時的に記憶する場所と考えれば良い．レジスターにある加工されたデータをメモリー
にコピーすることにより，データ処理が完成するのである．
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.9]{figure/COMET_II.eps}
  \caption{CPUと主記憶装置の関係}
  \label{fig:CUP_memory}
 \end{center}
\end{figure}
%
%=====================================================================
\section{COMET IIのレジスタ}
%=====================================================================
図\ref{fig:CUP_memory}を見て分かるように，COMET IIはCPUと主記憶装置(メインメモ
リー)から構成されている．大雑把に言うと，CPUは制御装置と演算装置，レジスターから
構成される．これらのうち，プログラマが注意を払うべきものは，
%
\begin{itemize}
 \item{主記憶装置}
 \item{レジスタ}
\end{itemize}
%
だけである．今後アセンブラでプログラムを書くと，制御装置や演算装置について，あま
り注意を払う必要が無いことが分かるだろう．

主記憶装置は，プログラム(命令とデータ)を記憶する装置でここでは特に説明しない．ア
センブラのプログラムを書くと自然に理解できるであろう．レジスターについては，プロ
グラムを記述する前にある程度理解する必要がある．COMET IIのレジスタを表
\ref{tab:CASL2_register}にまとめる．以降，それぞれのレジスタについて，説明する．
%
\begin{table}[h!]
 \caption{CASL IIのレジスタ}
 \label{tab:CASL2_register}
 \begin{center}
  \begin{tabular}{|l|l|l|p{60mm}|}
   \hline
   \multicolumn{1}{|c|}{記号} &
   \multicolumn{1}{c|}{語源} &
   \multicolumn{1}{|c|}{日本語} &
   \multicolumn{1}{c|}{機能} \\
   \hline \hline
   GR & General Register & 汎用レジスタ & 計算等に用いる．またGR1〜GR7
   は指標レジスタとしても使われる． \\
   \hline
   SP & Stack Pointer & スタックポインタ &
   スタック領域の最上段のアドレスを保持する． \\
   \hline
   PR & Program Register & プログラムレジスタ &
   次に実行する命令のアドレスを保持する \\
   \hline
   FR & Flag Register & フラグレジスタ &
   演算結果の状態を保持する \\
   \hline
  \end{tabular}
 \end{center}
\end{table}
%
%---------------------------------------------------------------------
\subsection{汎用レジスタ}
%---------------------------------------------------------------------
これは，算術や論理，比較，シフト演算を実行するときに使う．GR0〜GR7 までの8個
用意されている．あとは，教科書の通り．
%
\begin{itemize}
 \item 汎用レジスタは，8個用意されている．
 \item 汎用レジスタは，16ビットである．メインメモリーのデータやアドレスのビット数
      とおなじである．
\end{itemize}
%
%
%---------------------------------------------------------------------
\subsection{プログラムレジスタ}
%---------------------------------------------------------------------
プログラムカウンターと呼ばれることもある．このレジスタの値は，プルグラムが次
に実行する命令語の先頭番地を表す．したがって，
%
\begin{itemize}
 \item CPUには必ず，1個のプログラムレジスタが必要．
 \item プログラムレジスタは16ビットで，アドレスのビット数と同じ．
\end{itemize}
%
となる．

プログラムは，実行前に主記憶装置(メインメモリー)に格納されている．プログラムレジ
スタPRの値によって，プログラムを構成する命令を1つずつ取り出して，CPUは処理を行う．
このような方式を逐次制御方式，あるいはプログラム内蔵方式(stored program) と言う．
%
%---------------------------------------------------------------------
\subsection{フラグレジスタ}
%---------------------------------------------------------------------
Flag Regisuterのフラグとは，旗のことである．サッカーの試合では，プレーの状態によ
り審判が旗を上げる．あれと同じ働きをする．コンピューターでは演算の結果により旗を
上げる．

COMET IIには，1ビットのフラグレジスタが3個ある．演算結果によって，それらのレ
ジスタの値がセットされる．セットされる内容は，教科書P.18の表2.4の通りである．主
に，このレジスタは，実行順序を変更，分岐命令に使われる．
\begin{itemize}
 \item フラグレジスタは，3個あります．それで，計算結果の状態を表す．
 \item 各レジスタは旗の上げ下げなので，1ビットである．
\end{itemize}

あとは教科書の説明通り．
%
%---------------------------------------------------------------------
\subsection{スタックポインタ}
%---------------------------------------------------------------------
メインメモリーの一部をCPUが専用の記憶領域として使うことがある．そのときのメインメモリー
のアドレスを示す．したがって，
\begin{itemize}
 \item 必要なスタックポインタは，1個である．
 \item スタックポインタは16ビットで，アドレスのビット数と同じ．
\end{itemize}
となる．

これは，ここでは少し早すぎるので，実際に使うときに説明する．
%
%---------------------------------------------------------------------
\subsection{指標レジスタ(index register)}
%---------------------------------------------------------------------
これは，特殊なレジスタで，ハードウェアーは汎用レジスタが兼ねる．汎用レジスタのう
ちGR1〜GR7を使う．GR0を使わない理由，これはマシン語との関係で，後で述べる．
%
\begin{itemize}
 \item 指標レジスタは，汎用レジスタの7個が使える．
 \item 指標レジスタは16ビットで，メインメモリーのデータのビット数と同じ．
\end{itemize}
%

教科書の図2.5の表現は分かりにくいので，具体例でその動作を示す．例えばクラス40人
分の数学と英語と電子計算機のテストの点数がメモリに格納されているとする．それぞれ
の平均点を求める場合，指標レジスタを使うと便利である．このプログラムでは，それぞ
れの教科のクラスの合計点を計算するところが，重要である．指標レジスタを使う場合と
使わない場合のフローチャートを図\ref{fig:index_register}に示す．

指標レジスタを使わないと，プログラムが大変である．一方，指標レジスタを使うと，基
準点からのアドレスを加算して目的のデータにアクセスできる．加算する値を記憶するの
が指標レジスターである．このように，基準アドレスに加算して目的のアドレス求める方
法ををアドレス修飾と言う．

諸君は，これと同じプログラムテクニックをFORTRANの授業で学んでいる．このアドレス
修飾は，FORTRANの配列と同じことを行っている．指標レジスタは，FORTRANの配列の添え
字の役割を果たしているのである．FORTRANでは分かりにくいのですが，C 言語の配列は
まさにこれと同じことを行っている(実感できる)．
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.9]{figure/index_register.eps}
  \caption{指標レジスタを使った場合と使わない場合のプログラム．クラスの数学のテ
  ストの合計点を計算している．GR1を指標レジスタとして使っている．}
  \label{fig:index_register}
 \end{center}
\end{figure}
%
%---------------------------------------------------------------------
\subsection{COMET IIのハードウェアー}
%---------------------------------------------------------------------
これまでの話から，COMET IIのハードウェアーは図\ref{fig:COMET_II_CPU_and_Memory}
のようになっていることが分かるだろう．

CPUの役割は、命令に従いデータの加工(演算)を行うことである。その命令は、単純であ
る。単純なことしかできないが、その処理速度は、信じられないくらい高速\footnote{例
えば、Intel社のPentiumの場合、3GHzで動作する。1秒間に30億回、何かをするのである。}
である。CPUの回路は、2年生の時に学習した論理回路(組み合わせ回路、順序回路
\footnote {順序回路は4年生で学習する。})で構成されている。そこで、論理回路はどん
なの入出力の論理でも可能であることを学習したはずである。それも、たった3つ(and,
or,not)の回路の組み合わせで、できるから驚きである。このことから、どのような処理
でも可能な回路ができることが分かる。

2年生の時、or(論理和)とand(論理積)、not(否定)の回路がトランジスターで出来ること
を学習した。ブール代数というソフトウェアーがトランジスターというハードウェアーで
実現できるのである。コンピューターはまさにこれである。すなわち、トランジスターが
ビットパターン(命令とデータ)応じた電圧を制御することにより、論理演算を行っている。
要するに、いままで学習したビットパターンは、コンピューター内部では電圧のパターン
に変換されて、トランジスターにより論理演算を行うのである。論理演算を行う装置は、
以前学習した加算器のようなものである。

主記憶装置に格納されているデータは、16ビットのただのビットパターンである。16個の
0と1の集まりにすぎない。16進数で書くと、4桁の数字である。その4桁の16進数の数字が、
整数や文字、あるいは命令を表したりする。CPUは、それらをどのように区別しているの
であろうか?。そのからくりは?。それらを全く区別していないというのが答えである。た
だ単に、プログラムレジスタPR が示すアドレスの内容は命令と解釈するだけである。す
ごーく、単純である。後は、その命令に従い、主記憶装置の内容が命令になったり、整数
になったり、文字になったりしているだけである。メモリーの内容を見ただけでは、それ
が示すものは、文字なのか整数なのか、命令なのかは分からないのである。

COMET IIでは、命令と処理すべきデータ(整数や文字)が同じところに、区別無く格納され
ている。世界中にある普通のコンピューターも同じようになっている\footnote{命令と
データを区別して格納しているコンピューターをハーバードアーキテクチャーという．マ
イコンとして有名なPICがハーバードアーキテクチャーである．}。このように、命令
とデータ区別しないで、同じメモリーに格納するコンピューターをノイマンアーキテクチャ
ーと言う。

通常のコンピューターは、とてつもないビットの操作をしていることが分かるであろう。
それもひとつも間違えないで行うのは奇跡に等しいと思える。どのようにしているのであ
ろうか?。
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.9]{figure/config_COMETII.eps}
  \caption{COMET IIのハードウェアーとプログラムの状態}
  \label{fig:COMET_II_CPU_and_Memory}
 \end{center}
\end{figure}
%=====================================================================
\section{命令の表現方法}
%=====================================================================
コンピューターのプログラムは，命令とデータから構成されるのは，以前に述べたとおり
である．CASL IIで扱うデータは整数と文字だけである．これらのデータをメモリーに格
納する方法は，既に学習が済んでいる．ここでは，命令がどのようにメモリーに格納され
るか学習する．
%---------------------------------------------------------------------
\subsection{プログラム例}
%---------------------------------------------------------------------
一般的なことは言わないで，実際の例で命令がデータに格納される様子を示す．リスト
\ref{prog:add}に示したプログラムを用いて，メモリーに格納される様子を示す．その前
に，このプログラムの動作を示した方がよいだろう．これは
%
\begin{itemize}
 \item 3+5を計算する
\end{itemize}
%
だけである．FORTRANでは\texttt{C=3+5}，C言語では\texttt{c=3+5;}と書けばすむこと
を，アセンブラではこのようにいろいろ書かなくてはならない．理由は，後で説明する．
%
\lstinputlisting[caption=CASL IIのプログラム例．3+5を系算する,label=prog:add]
{program/add.cas}

図\ref{fig:flow_chart}がこのプログラムの動作をフローチャートである．また，プログ
ラムの各行の動作と命令/データの区別を表\ref{table:add_cas}に示しておく．
%
\begin{table}[H]
\begin{center}
 \caption{リスト\ref{prog:add}の各行の動作内容と命令/データの区別}
\label{table:add_cas}
 \begin{tabular}{rllll}
  \hline
  \multicolumn{1}{c}{行} & \multicolumn{1}{c}{文} 
  & \multicolumn{1}{c}{機能} & \multicolumn{1}{c}{種類}\\
  \hline \hline
  1 & \texttt{PGM START}  & プログラムは，STARTから開始     & \\
  2 & \texttt{LD GR1,A}   & Aの値をレジスタGR1に格納        & 命令 \\
  3 & \texttt{ADDA GR1,B} & GR1とBの値を加算して，GR1に格納 & 命令 \\
  4 & \texttt{ST GR1,C}   & GR1の値をCに格納                & 命令 \\
  5 & \texttt{RET}        & 呼び出し元へ戻る                & 命令 \\
  6 & \texttt{A DC 3}     & 値(3)$_{10}$を格納              & データ \\
  7 & \texttt{B DC 5}     & 値(3)$_{10}$を格納              & データ \\
  8 & \texttt{C DS 1}     & 1ワード予約                     & データ \\
  9 & \texttt{END}        & プログラムの終わりを示す        &  \\
  \hline
 \end{tabular}\\
\end{center}
\end{table}
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]{figure/program.eps}
  \caption{プログラムとフローチャート}
  \label{fig:flow_chart}
 \end{center}
\end{figure}
%
%---------------------------------------------------------------------
\subsection{アセンブラ言語を機械語に変換}
%---------------------------------------------------------------------
リスト\ref{prog:add}のプログラムの大体の動作が分かったと思う．そこで，これをメモ
リーに格納できるように，ビットパターン(16進整数)に変換しよう．この簡単なプログラ
ムの命令の詳細は分からなくても良いが，命令もビットパターンに変換されることは理解
しなくてはならない．

表\ref{table:add_cas}を見て分かるように，このプログラムは命令とデータからで
きている．ここで，命令を16進数に直す方法が分かれば，プログラムの全てをビットパター
ンに変換できる．このビットパターンこそ，コンピューターが唯一理解できるマシン語で
ある．ここでは，人間の分かるアセンブラ言語からコンピューターが理解できるマシン語
に変換する方法を学ぶのである．
%----------------------------
\subsubsection{マシン語変換表}
%----------------------------
文字の変換の仕方が，表(教科書p.13 JIS X0201)になっていたように，命令も表になって
いる．教科書のp.213の命令語の構成に，全ての命令のビットパターンが書かれている．
これから分かるように，CASL IIには命令の数は40個程度しかない．

ただ，表の見方が，文字のコード表よりちょっと難しい．整数や文字は，16ビットのビッ
トパターンであったが，命令の場合は16ビットであったり，32ビットだったりする．少し
厄介であるが，慣れればたいしたことない．

それでは，実際の表の見方を示す．まずは，表の中央より右側に機械語命令(アセンブラ
言語)が書かれている．その左側がマシン語を表し，右側がその意味(動作)を記述してい
る．今は，動作はどうでもよいので，アセンブラの命令と機械語の対応を考える．たとえ
ば，\texttt{LD}命令を例にとる．表の機械語命令\texttt{LD}を見ると，2つあることに
気が付く．それは，
%
\begin{center}
 \begin{tabular}{ll}
  \texttt{LD} & \texttt{r,adr,x} \\
  \texttt{LD} & \texttt{r1,r2}
 \end{tabular}
\end{center}
%
である．\texttt{LD}は分かるとして，それ以外(オペランド)が分からない．詳しいこと
は，今後の学習に譲るとして，それを簡単にまとめると，次のようになる．
%
\begin{center}
 \begin{tabular}{llll}
  & \texttt{r}  & 汎用レジスター & \texttt{GR0}〜\texttt{GR7} \\
  & \texttt{r1} & 1つの命令で2つの汎用レジスターを使うときの一方 &
  \texttt{GR0}〜\texttt{GR7} \\
  & \texttt{r2} & もう一方の汎用レジスター &
  \texttt{GR0}〜\texttt{GR7} \\
  & \texttt{adr} & アドレスを示す．& レベル名が書かれることが多い．\\
  & \texttt{x} & アドレスをシフトするインデックスレジスタ．&
  \texttt{GR1}〜\texttt{GR7} \\
 \end{tabular}
\end{center}
%
これで表の見方がわかった．アセンブラのプログラムをマシン語に変換できるようになっ
た．

たとえば，ラベル\texttt{A}が(A007)$_{16}$として，\texttt{LD GR1,A,GR2}
という命令は，
%
\begin{center}
 \begin{tabular}{lll}
  \texttt{LD GR1,A,GR2}  & $\Rightarrow$ & (1012)$_{\texttt{16}}$ \\
                         &               & (A007)$_{\texttt{16}}$ \\
 \end{tabular}\\
\end{center}
%
と変換される．また，\texttt{LD GR1,GR2}という命令は，
%
\begin{center}
 \begin{tabular}{lll}
  \texttt{LD GR1,GR2}  & $\Rightarrow$ & (1412)$_{\texttt{16}}$ \\
 \end{tabular}
\end{center}
%
と変換される．これで，命令が1語の場合と2語の場合があることが分かるであろう．表を
見て分かるように，2語を使う命令場合，その2語目は必ず，アドレスとなっている．

これで，全て終わるのはまだ早い．賢い者は，\texttt{LD GR1,A} という命令の変換方法
に疑問が湧くであろう．インデックスレジスターが無い場合である．これは，
%
\begin{center}
 \begin{tabular}{lll}
  \texttt{LD GR1,A}  & $\Rightarrow$ & (1010)$_{\texttt{16}}$ \\
     &               & (A007)$_{\texttt{16}}$ \\
 \end{tabular}
\end{center}
%
と変換される．すなわち，命令を構成する2語の最初の1語の第0〜3ビットがゼロの場合，
インデックスレジスターが無いと判断されるのである．もし，インデックスレジスターに
\texttt{GR0}が使えると，インデックスレジスターが無い場合と\texttt{GR0}を使ってい
る場合の区別ができなくなる．そのような理由から，インデックスレジスターに
\texttt{GR0}が使えないのである．ハードウェアー(CPU)がそうなっているからである．
%
%------------------------------
\subsubsection{ハンドアセンブル}
%------------------------------
準備が整ったので，リスト\ref{prog:add}のプログラムをマシン語(ビットパターン)に変
換する．これをビットパターンに変換したものが，教科書のp.17の図2.4に書かれている．
ただし，この表には間違いがあるので，注意が必要である．プログラムの最初の
\texttt{PGM START}はアセンブラ命令と言って，機械語に変換されない．これについては
来週の授業で説明する．したがって，最初に機械語に変換される命令は，\texttt{LD
GR1,A}となる．その変換は，次のように行う．
%
\begin{enumerate}
 \item \texttt{LD}という命令から，16進数4桁の表示の最上位の桁は
      (1)$_{16}$と分かる．
 \item 次の桁は，\texttt{LD}には，(0)$_{16}$か(4)$_{16}$である．ここで
      は，\texttt{LD r,adr,x}のパターンとなっているので，次の桁は
      (0)$_{16}$と分かる．
 \item 次の桁は，汎用レジスターを示す．ここで使われている汎用レジスターは，
       \tw{GR1}なので，(1)$_{16}$となる．
 \item 次の桁は，インデックスレジスターを示す．インデックスレジスター
      は無いので，その桁は(0)$_{16}$となる．
\end{enumerate}
%
ここの命令は，\texttt{LD r,adr,x}のパターンであるので，命令語長は2語である．最初
の1語は今示したとおり，(1010)$_{16}$である．次の1語は，ラベル$A$のアドレスである．
これは，プログラムが格納されるアドレスに依存する．ここでは，教科書(p.17の図2.4)
に沿って，(A000)$_{16}$からプログラムは格納されるとすると，$A$のアドレスは
(A007)$_{16}$となる．これが第2 語のビットパターンとなる．以上をまとめると，
\begin{center}
 \begin{tabular}{lllll}
  & \multicolumn{1}{c}{命令}
  &
  & \multicolumn{1}{c}{16進数}
  & \multicolumn{1}{c}{2進数}\\
  & \texttt{LD GR1,A} & & 1010 & 0001000000010000 \\ 
  &                   & & A007 & 1010000000000111 \\ 
 \end{tabular}
\end{center}
% 
となる．

このようにアセンブラー言語を人間が表を見ながら，マシン語に変換することをハンドア
センブル(ほとんど死語か?)と言う．これは単純作業なので，通常は，コンピューターの
仕事である．ただし，コンピューターを学習する者にとっては，一度は経験しておきたい
ことである．
%=====================================================================
\section{課題(レポート)}
%=====================================================================
\setcounter{toi_num}{1}
\begin{quote}
 \begin{itemize}
  \item[\toi] 本プリントの\pageref{prog:add}ページのリスト\ref{prog:add}を参考にし
	      て，\tw{1+2+3}を計算するプログラムを作成せよ．
  \item[\toi] 残りの命令
	      \begin{quote}
	       \begin{tabular}{ll}
		\texttt{ADDA} & \texttt{GR1,B} \\
		\texttt{ST} & \texttt{GR1,C}\\
		\texttt{RET}
	       \end{tabular}
	      \end{quote}
	      をハンドアセンブルして，マシン語に直せ．結果は分かっているので，そ
	      の過程をきちんと書くこと．
  \item[\toi] 教科書の17ページの図2.4は間違っている．間違いを捜し，訂正せよ．
 \end{itemize}
\end{quote}
%---------------------------------------------------------------------
\subsection{レポート提出要領}
%---------------------------------------------------------------------
提出方法は，次の通りとする．
% 
\begin{quote}
 \begin{tabular}{ll}
  期限 & 11月25日(金)PM1:00まで \\
  用紙 & A4 \\
  提出場所 & 山本研究室の入口のポスト \\
  表紙 & 表紙を1枚つけて，以下の項目を分かりやすく記述すること．\\
       & \qquad 授業科目名「電子計算機」\\
       & \qquad 課題名「課題5　マシン語」\\
       & \qquad 3E\quad 学籍番号\quad 氏名\\
       & \qquad 提出日\\
  内容 & 問題の解答．\\
 \end{tabular}
\end{quote}
%
%
%=====================================================================
\end{document}



