%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
% レジスター
% last updated 2004.5.31
%    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
%
%　丸数字の定義
% use as \MARU{2} 活用の仕方
\def\MARU#1{{\rm\ooalign{\hfil\lower.168ex\hbox{#1}\hfil\crcr\mathhexbox20D}}} 
%
\newcommand{\tw}[1]{\texttt{#1}}
%
\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{document}
\title{これまでの復習(後期中間試験に向けて)}
\date{2005年11月25日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
\begin{screen}
 もっとも手っ取り早く点数がとれる勉強は，過去問を理解することである．最低限，昨
 年と一昨年の過去問が解けるようになること．昨年までは50分の年間授業であったた
 め，試験範囲は昨年までの前期末試験の途中までなので注意すべし．過去問は，私のweb
 ページ(http://www.akita-nct.jp/\~{}yamamoto/)からたどれば見つかる．
\end{screen}
%
%=====================================================================
\section{CASL IIとは}
%=====================================================================
\begin{itemize}
 \item コンピューター内部では，データと命令は0と1の2進数で表現されます．たとえば，
       加算命令(足し算)は，00100000000100000000000000001010です(教科書p.1)．これ
       を機械語といいます．
 \item これは，覚えるのも大変なので，この命令を人間にわかり易くする工夫が考えら
       れました．0と1の機械語の代わりに，ADDA GR1, ADDRESと，表記するようにした
       のです(教科書p.1)．これがアセンブラ言語です．
 \item 実際のコンピューターの動作は機械語なので，アセンブラ言語は，アセンブラー
       と言うプログラムで，機械語に変換します．
 \item 高級言語，たとえばFORTRANとアセンブラ言語には，大きな違いがあります．高級
       言語の1個の命令をコンパイルしてマシン語に変換すると，それは数多くのマシン
       語から構成されます．一方，アセンブラ言語をアセンブルすると，1個のマシン語に
       なります．即ち，アセンブラ言語はマシン語と1対1の対応があります．
 \item アセンブラ言語はCPUの動作を指示するものとも言えます．したがって，CPUの種
       類によりそのアセンブラ言語は異なります．
 \item 基本情報技術者試験でも，アセンブラ言語があります．その場合，CPU毎に試験を
       していたのでは，大変です．そこで，仮想のアセンブラ言語，CASL IIが考えられ
       ました．このアセンブラ言語が動作する仮想のハードウェアーをCOMET IIといい
       ます．
\end{itemize}
%
%=====================================================================
\section{チューリング機械とノイマン型コンピューター}
%=====================================================================
\begin{itemize}
 \item チューリング機械は，図\ref{fig:Turing_machine}のような構造をし
      ています．そして，その動作は，次の通りです．
      \begin{itemize}
       \item 書き換え可能な無限に長いテープと，オートマトンと言われる移動可能な
	     機械からできている．
       \item テープには，いろいろな記号が書かれている．
       \item オートマトンには，テープの内容を読み書き可能なヘッドと内部状態を記
	     憶する装置，テープの任意の位置に移動する装置から構成されている．
       \item オートマトンの動作(テープの読み書き)や移動は，今の場所のテープの記
	     号と内部状態により決まる．
      \end{itemize}
      \begin{figure}[hbtp]
       \begin{center}
	\includegraphics[keepaspectratio, scale=0.7]{figure/Turing_machine.eps}
	\caption{チューリング機械}
	\label{fig:Turing_machine}
       \end{center}
      \end{figure}
 \item この単純なチューリング機械で，ほとんどあらゆる計算ができます．計算できな
       い問題もあるようですが，これはここの講義のレベルを超えます．
 \item このチューリング機械を実際に実現させたものが，ノイマン型コンピューターで
       す．その特徴は，以下の通りです．
      \begin{itemize}
       \item 1次元的に並んだメモリーがあり，そこにプログラム(命令)もデータも格納
	     される．メモリーの内容は，自然数の番地で参照できる．
       \item メモリーに格納されたプログラム(命令)とデータの見かけ上の区別はない．
	     プログラムをデータとして見ることも，データをプログラムとしてみるこ
	     ともできる．
      \end{itemize}
\end{itemize}
%
%=====================================================================
\section{基数の変換(2,\,10,\,16進数)}
%=====================================================================
\begin{itemize}
 \item{いろいろな数の表記方法があります．N進数の場合，次のようにN個の
      底で数を表現します．\vspace{3mm}\\
      \begin{tabular}{rl}
       2進数  & 0,\,1\\
       10進数 & 0,\,1,\,2,\,3,\,4,\,5,\,6,\,7,\,8,\,9 \\
       16進数 & 0,\,1,\,2,\,3,\,4,\,5,\,6,\,7,\,8,\,9,\,A,\,B,\,C,\,D,\,E,\,F \\
      \end{tabular}\vspace{3mm}
      }
      %
 \item{桁上がりは，2進数の場合1の次で10に，10進数の場合9の次で10に，16
      進数の場合Fの次で10になります．}
      %
 \item{我々が通常用いている数の表現の意味は，次の通りです．数字の並ぶ
      順序が重要です．これを「位取り記数法」と言います．}
      \begin{align*}
       (1905)_{10}=(1\times 10^3+9\times 10^2+0\times 10^1+5\times 10^0)_{10}
      \end{align*}
      %
 \item{基数の変換(2→10進数)．通常の位取り記数法が理解できれば，簡単です．
      \begin{align*}
       (1101)_2
       &=(1\times10^{11}+1\times 10^{10}+0\times 10^{1}+1\times 10^{0})_2\\
       &=(1\times 2^3+1\times 2^2+0\times 2^1+1\times 2^0)_{10}
       \qquad\leftarrow\text{普通はここから計算}\\
       &=(8+4+0+1)_{10}
       \qquad\leftarrow\text{ここから計算しても良い}\\
       &=(13)_{10}
      \end{align*}
      }
      %
 \item{2進数の各桁の10進数の値(重み)を覚えておくと便利です．
      \begin{align*}
       1,\,2,\,4,\,8,\,16,\,32,\,64,\,128,\,256,\,512,\,1024,\,2048,\,4096
      \end{align*}
      }
      %
 \item{基数の変換(10$\rightarrow$2進数)．2で割った余りを並べます．変換方法の例を，
      以下に示します．\\
      $(19)_{10}=(10011)_2,\quad(2003)_{10}=(11111010011)_2$ です．
      %
      \begin{figure}[H]
       \begin{center}
	\includegraphics[keepaspectratio, scale=0.7]
	{figure/decimal_to_binary.eps}
	\caption{10進数から2進数への変換方法．}
	\label{fig:decimal_to_binary}
       \end{center}
      \end{figure}
      %
      }
      %
 \item{基数の変換(16$\rightarrow$10進数)．これも，2進数と同じです．
      \begin{align*}
       (376)_{16}
       &=(3\times 10^2+7\times 10^1+6\times 10^0)_{16}\\
       &=(3\times 16^2+7\times 16^1+6\times 16^0)_{10}\\
       &=(3\times 256+7\times 16+6\times 1)_{10}\\
       &=(886)_{10}
      \end{align*}
      }
 \item{基数の変換(2→16進数)．2進数の各桁を，最小桁から4桁ずつ区切り，
      それぞれを16進数に変換します．
      %
      \begin{figure}[H]
       \begin{center}
	\includegraphics[keepaspectratio, scale=1.0]
	{figure/binary_to_hex.eps}
	\caption{2進数から16進数への変換方法．}
	\label{fig:binary_to_hex}
       \end{center}
      \end{figure}
      %
      }
 \item{桁数が合わない場合は，先頭に必要なだけゼロを書き足して考えます．
      例えば，$(101100)_2 =(00101100)_2=(2\texttt{C})_{16}$ となります．}
 \item{基数の変換(16$\rightarrow$2進数)．16進数の各桁を(1, 2, 4, 8)の
      和に展開して，それぞれのビットに対応させます．
      %
      \begin{figure}[H]
       \begin{center}
	\includegraphics[keepaspectratio, scale=1.0]
	{figure/hex_to_binary.eps}
	\caption{16進数から2進数への変換方法．}
	\label{fig:hex_to_binary}
       \end{center}
      \end{figure}
      %
      }
 \item{基数の変換(10$\rightarrow$16進数)．2つの方法があります．
      \begin{enumerate}
       \item{一旦，2進数へ変換した後，16進数へ変換する．$\qquad\leftarrow$おすすめ}
       \item{16で割って，その余りが各桁になる．}
      \end{enumerate}
      }
\end{itemize}
%
%=====================================================================
\section{負の数の表現}
%=====================================================================
\begin{itemize}
 \item{COMET IIでは，負の整数は2の補数で表現されます．メモリーの中に，
      16ビットで格納されます．}
 \item{負の数を2の補数で表現する手順は，以下の通りです．
      \begin{enumerate}
       \item[\MARU{1}]{負の数の絶対値を2進数で表現して，ビット反転する．}
       \item[\MARU{2}]{+1加算}
      \end{enumerate}
      \begin{itemize}
       \item[[例]]{$(-18)_{10}$は，COMET IIの内部，16ビットの2の補数は，
		$(1111111111101110)_2$と表されます(メモリーへの格納状
		態)．}
      \end{itemize}
      \vspace{3mm}
      \begin{center}
       \begin{tabular}{llll}
	$(-18)_{10}$\hspace{5mm} & 0000000000010010 & $\leftarrow$
	& 18の2進数表現(16ビット) \\
	& 1111111111101101 & $\leftarrow$ & ビット反転\\
	& 1111111111101110 & $\leftarrow$ & +1加算
       \end{tabular}
       \end{center}
      }
 \item{2の補数を使うと，以下の有利な点があります．
      \begin{itemize}
       \item{負の数の加算が通常の加算器で出来る．}
       \item{加算の場合の負の数，あるいは減算は，\MARU{1}2の補数に変換
	    して，\MARU{2}加算器による加算を行う．減算器を作るより，こ
	    の方が回路が簡単になる．}
      \end{itemize}
      \begin{figure}[H]
       \begin{center}
	\includegraphics[keepaspectratio, scale=1.0]
	{figure/hosuukeisan.eps}
	\caption{補数を使った計算}
	\label{fig:hosuukeisan}
       \end{center}
      \end{figure}
      }
 \item{2の補数を求める手順(\MARU{1}ビット反転 \MARU{2}+1加算)は，コン
      ピューター内部表現では，$\times (-1)$と同じです．}
 \item{COMET IIの符号付き整数
      \begin{itemize}
       \item{正の数は16ビット2進数でそのままの表現です．一方，負の数は
	    2の補数を使います．正か負かの判断は，最上位のビットで判断
	    します．最上位の第15ビットが0ならば正，1であれば負です．}
       \item{最上位のビットが符号を表すため，絶対値は残りのビットで表
	    すことになります．したがって，表現可能な整数は-32768〜
	    32767です．
	    \begin{center}
	     \begin{tabular}{ll}
	      正の整数の最大値
	      & $(0111111111111111)_2=(2^{15}-1)_{10}=(32767)_{10}$\\
	      負の整数の絶対値の最大値
	      & $(1000000000000000)_2=(2^{15})_{10}=(32768)_{10}$
	     \end{tabular}
	    \end{center}
	    }
      \end{itemize}
      }
 \item{COMET IIの符号無し整数
      \begin{itemize}
       \item{正の数は16ビット2進数でそのままの表現です．一方，負の数を
	    表すことはできません．}
       \item{正の整数は，16ビットのパターンが2進数と同じです．したがっ
	    て，表現可能な整数は0〜65535です．
	    \begin{center}
	     \begin{tabular}{ll}
	      最小値
	      & $(0000000000000000)_2=(0)_{10}$\\
	      最大値
	      & $(1111111111111111)_2=(2^{16}-1)_{10}=(65535)_{10}$
	     \end{tabular}
	    \end{center}
	    }
      \end{itemize}
      }
\end{itemize}
%
%=====================================================================
\section{COMET IIの文字の取り扱い}
%=====================================================================
\begin{itemize}
 \item{数値と異なり，文字にはそれぞれ，番号をつけて区別します(コード化)．
      文字とそれに対応する番号は，規格 JIS X0201 ラテン文字・片仮名用8
      単位符号で決まっています．}
 \item{この番号は，8ビットなので，最大256文字しか使えません．数字とアル
      ファベットと片仮名と記号を表すのであれば十分です．漢字は，使えま
      せん．}
 \item{COMET IIの1ワード16ビットに対して，文字は8ビットしか使いません．
      COMET IIでは1ワードで1文字を表すため，16ビットのうち上位8ビット
      は0として，下位8ビットで1文字分を表します．例えば，アルファベッ
      トのYamaを表す場合，Yは(59)$_{16}$，aは(61)$_{16}$，mは
      (6D)$_{16}$，という番号がついているので，COMETのメモリーには，次
      のように格納されます．ただし，アドレスの実際の割り当ては，OSが決
      めます．
      \begin{figure}[H]
       \begin{center}
	\includegraphics[keepaspectratio, scale=0.9]{figure/char_Yama.eps}
	\caption{文字列"Yama"のメモリーへの格納}
	\label{fig:char_Yama}
       \end{center}
      \end{figure}
      }
 \item{数値と文字では，メモリーの中身は異なります．例えば，数値の
      (9)$_{10}$と文字の"9"は，以下のようになります．文字の"9"は，JIS
      X0201では，(39)$_{16}$です(図\ref{fig:char_int_9})．
      \begin{figure}[H]
       \begin{center}
	\includegraphics[keepaspectratio, scale=0.9]{figure/char_int_9.eps}
	\caption{数値の(9)$_{10}$と文字"9"のメモリーへの格納}
	\label{fig:char_int_9}
       \end{center}
      \end{figure}
      }
 \item{メモリーの中身を見ると，それが数値なのか文字なのか，判断できませ
      ん．命令毎に数値を扱うのか，文字を扱うのか決まっています．}
\end{itemize}
%
%=====================================================================
\section{主記憶装置とレジスタ}
%=====================================================================
\begin{itemize}
 \item{COMET IIでは，16ビットを1ワード(1語)と言い，この単位でデータの処
      理をします．}
 \item{主記憶装置(メインメモリ)には，1ワード(16ビット)毎にアドレスがつ
      いています．アドレスも16ビットです．}
 \item{コンピューターのプログラムは，データと命令から構成されます．こ
      の命令とデータは，実行時に主記憶装置(メインメモリ)に格納されます．}
 \item{レジスタもデータなどを蓄えるので，主記憶装置同様，メモリの一種
      です．しかし，それぞれ，役割が異なります．主記憶装置は，いろいろ
      なデータ(命令もデータの一種と考える)を蓄えるファイルキャビネット
      のようなものです．一方，レジスタは，実際にCPUがデータを加工する
      ときに一時的に記憶する場所です．}
 \item{CPUと主記憶装置は，図\ref{fig:CUP_memory}のような関係です．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}
      }
 \item 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}
 \begin{itemize}
  \item 汎用レジスター
	\begin{itemize}
	 \item 計算等に主に用いられる．
	 \item 16ビットのレジスターが8個(\tw{GR0}〜\tw{GR7})ある．
	\end{itemize}
  \item スタックポインター
	\begin{itemize}
	 \item スタック領域(主記憶装置でCPUが記憶場所として使うことがで
	       きる領域)の最上段のアドレスを格納している．
	 \item 16ビットのレジスターが1個ある．
	\end{itemize}
  \item プログラムレジスター
	\begin{itemize}
	 \item 次に実行する命令のアドレスを格納している．
	 \item 16ビットのレジスターが1個ある．
	\end{itemize}
  \item フラグレジスター
	\begin{itemize}
	 \item 計算結果などの状態を格納している．
	 \item 3個の1ビットのレジスターがある．
	       \begin{center}
		\begin{tabular}{ll}
		 \tw{OF} & 
		 計算結果がオーバーフローしたとき等，1が設定される．\\
		 \tw{SF} &
		 計算結果が負(第15ビットが1)のとき等に，1が設定される．
		 \\
		 \tw{ZF} &
		 計算結果がゼロ(全てのビットが0)とき等に，1が設定される．
		\end{tabular}
	       \end{center}
	\end{itemize}
 \end{itemize}
 \item 指標レジスターと言うものもあります．
      \begin{itemize}
       \item 汎用レジスターの\tw{GR1}〜\tw{GR7}が兼ねます．専用のハードウェアー
	     は無いということです．
       \item アドレスをオフセットするときに使います．
      \end{itemize}
\end{itemize}
%
%=====================================================================
\section{アセンブラ言語をマシン語に変換}
%=====================================================================
\begin{itemize}
 \item プログラムは，命令とデータから構成される．プログラムを実行するためには，
       アセンブラ言語を0と1のビットパターンのマシン語に変換する必要がある．命令
       とデータをビットパターンに変換するのである．
 \item リスト\ref{prog:add}は，3+5を計算するプログラムである．これを，ビットパター
       ンに変換すると，図\ref{fig:assember_to_binary}のようになる．
 \item 教科書のp.213の命令語の構成に従って，命令のビットパターンに変換できる．こ
       れは，問題文に載せるので憶える必要は無い．
 \item この命令語の構成に書かれているオペランドを簡単にまとめると，次のようになる．
       \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} 
 \item 最初に機械語に変換される命令は，\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 語のビットパターンとなる．
\end{itemize}
%
\lstinputlisting[caption=CASL IIのプログラム例．3+5を系算する,label=prog:add]
{program/add.cas}
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]
  {figure/convert_machine_language.eps}
  \caption{アセンブラ言語をマシン語へ変換}
  \label{fig:assember_to_binary}
 \end{center}
\end{figure}
%
%=====================================================================
\section{アセンブラ言語(CASL IIの書き方)}
%=====================================================================
\begin{itemize}
 \item 人間が理解できるアセンブラ言語(ここではCASL II)のソースプログラムを，コン
       ピューターが理解できるマシン語に直すプログラムをアセンブラーと言う．
 \item CASL IIのアセンブラ言語の命令は，アセンブラ命令と機械語命令，マクロ命令に
       分けられる．
       \begin{itemize}
	\item アセンブラ命令はアセンブラーに指示するためにある．CPUが実行する機
	      械語に変換されない．ただし，データはビットパターンに変換される．
	\item 機械語命令は，実際にCPUの動作を記述する．機械語命令は，CPUが動作す
	      るためのある特定のビットパターンに変換される．
	\item マクロ命令はCPUが実行するビットパターンに変換されるが，機械語命令
	      のような1対1の対応はない．多くの機械語命令を組み合わせて，その命令
	      を実行する．
       \end{itemize}
 \item CASL IIのプログラムは，図\ref{fig:description_code}のように記述する．
       \begin{itemize}
	\item ラベル欄に文字列は，アドレスを表す．オペランドとしてそれが使われる
	      と，マシン語では，その行のアドレスに変換される．
	\item 命令コード欄には命令が書かれる．
	\item オペランドには，命令コードが処理を行う対象を書く．
	\item セミコロン(;)を書くと，それ以降から行の終わりまで，コメント(注釈)文とし
	      て解釈され，アセンブラーは無視する．
       \end{itemize}
\end{itemize}
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.8]
  {figure/description_code.eps}
  \caption{CASL IIのプログラムの書き方}
  \label{fig:description_code}
 \end{center}
\end{figure}
%
%
%=====================================================================
\end{document}



