%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
%    CASL IIの命令の種類とプログラムの書き方
%      last updated 2005.12.15
%        created by  Masashi Yamamoto
%        e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,float,misc,lgrind,float}
\usepackage{listings, jlisting}
\usepackage{html}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm　奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm　偶数ページ
\textwidth 160mm
%
\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年12月16日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{前回の復習と本日の学習}
%=====================================================================
%---------------------------------------------------------------------
\subsection{前回の復習}
%---------------------------------------------------------------------
前回の講義では，CASL IIのシミュレーターである\htmladdnormallink{WCASL
II}{http://www.ics.teikyo-u.ac.jp/wcasl2/}~\cite{WCASL2}の使い方を学習した．今後，
CASL IIのプログラムを学習するときに役立てて欲しい．

中間試験前になるが前々回の講義では，CASL IIの命令の種類とプログラムの書き方につ
いて学習した．プログラムの書き方は図\ref{fig:description_code}のとおりで，4つの
記述欄があり，それぞれは1つ以上の空白で区切る．また，セミコロン\tw{;}を書けば，
行のそれ以降は注釈文(コメント文は)となりアセンブラーは無視をする．

さらに，命令は以下の3種類に分けられることも学習した．
\paragraph{アセンブラ命令}ソースプログラムを機械語に変換するアセンブラーに対し
 ての命令で，特定のビットパターンに変換されない．また，この命令はCPUを動作させる
 ことはない．
\paragraph{機械語命令}CPUの実際の動作を指示する命令で，特定のビットパターンに変
 換される．この命令と機械語は1対1の対応がある．
\paragraph{マクロ命令}複数の機械語命令を集めて，一つの名前を付けた命令である．こ
れは特定の機械語に変換されるが，ひとつの命令は多くの機械語になる．
%
\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}
%
%---------------------------------------------------------------------
\subsection{本日の学習内容}
%---------------------------------------------------------------------
教科書のp.28-35のアセンブラ命令を学習する．ゴールは以下のとおりである．
%
\begin{itemize}
 \item{アセンブラ命令の役割が分かる．}
 \item{CASL IIのアセンブラ命令(\tw{START, END, DC, DS})の使い方が分かる．}
\end{itemize}
%
である．
%
%=====================================================================
\section{アセンブラ命令と機械語命令の違い}
%=====================================================================
以前の講義で図\ref{fig:description_code}のプログラムを学習した．このプログラムを
実行する過程を考えよう．テキストエディター\footnote{テキストファイルを編集するプ
ログラム．Windowsのワードパッドなど．}を使って，このプログラムを書き上げると，次
の操作を行い，プログラムを実行させる．
\begin{enumerate}
 \item アセンブラーをつかって，図\ref{prog:add}のソースプログラムを機械語に
       直したファイルを作成する．
 \item 機械語のファイルを実行させる．
       \begin{itemize}
	\item 機械語のファイルをCOMET IIのメモリーに格納する．
	\item OSが実行する命令が書かれた先頭番地をコールする．
	\item 命令に従いプログラムが実行される．
       \end{itemize}
\end{enumerate}

これらプログラムのアセンブルと実行の操作で，アセンブラ命令と機械語命令(マクロ命
令も)は，指示する相手が決定的に異なる．
\begin{itemize}
 \item アセンブラ命令は，ソースプログラムをアセンブラーがアセンブルして実行ファ
       イルを作成するときに，アセンブルの方法を示したものである．アセンブラ命令
       は，このアセンブルするときのアセンブラーに対して指示を行う．
 \item 機械語命令はプログラム実行時に，CPUに対して指示を行う．
\end{itemize}
教科書では，アセンブラ命令のある文を非実行文と書いてある．プログラムを実行させた
場合，アセンブラ命令の行は実行されないからそのように呼ばれるのである．

プログラマーは，アセンブラ命令と機械語命令の違いをしっかりと認識しなくてはならな
い．CASL IIには，アセンブラ命令は，次の4個しかない．以降，それぞれについて説明す
る．
\begin{description}
 \item[\tw{START}]プログラムの実行開始行を示す．
 \item[\tw{END}]プログラムの記述の終わりを示す．
 \item[\tw{DC}]メモリーを確保して，初期化を行う．
 \item[\tw{DS}]メモリーを確保する．
\end{description}
%=====================================================================
\section{プログラムの開始と終了}
%=====================================================================
%---------------------------------------------------------------------
\subsection{プログラムの始まり(START)}
%---------------------------------------------------------------------
%
\begin{screen}
 \textbf{\Large 書式}\hspace{10mm}
 \begin{tabular}{lll}\hline
  \textbf{\footnotesize ラベル欄}　 & 
  \textbf{\footnotesize 命令コード欄} & 
  \textbf{\footnotesize オペランド欄} \\ \hline 
  \tw{label} & \tw{START} & [実行開始番地] \\ \hline
 \end{tabular}
\end{screen}
%
\begin{itemize}
 \item{プログラムの先頭は，\tw{START}命令で始まらなくてはならない．}
 \item{ラベルは，必要不可欠である．}
 \item{実行開始番地は無くても良い．絶対番地を書くことは稀で，通常，最
      初に実行する命令が書かれている行のラベル名を書く．}
 \item{非実行文なので，フラグレジスタは変化しない(関係ない)．}
\end{itemize}

この命令の役割は，プログラムの実行開始番地(アドレス)をアセンブラーに対して指示す
ることである．プログラムの先頭に必ず書く必要があり，これが無いと，どこからプログ
ラムを実行するか分からない．プログラム実行時に，この\tw{START}命令が示すアドレス
が最初のPR(プログラムレジスタ)の値になる．これが実行開始番地である．

リスト\ref{prog:add}のプログラムで\tw{START}命令の役割を考える．このプログラムを
アセンブラーが機械語に変換すると，図\ref{fig:memory_command}のようになる．START
とEND命令はアセンブラ命令であるため，マシン語に変換されない．他のアセンブラ命令，
\tw{DC}や\tw{DS}は，それが示すデータに変換される．
%
\lstinputlisting[caption=CASL IIのプログラム例．3+5を計算する,label=prog:add]
{program/add.cas}
%

\tw{START}命令はマシン語に変換されないが，プログラマーはアセンブラーに，このプロ
グラムはラベル\tw{BEGIN}から実行すると言うことを伝えなくてはならない．ラベル
\tw{BEGIN}は，最初に実行する命令
%
\begin{quote}
 \tw{LD  GR1,A}
\end{quote}
%
の先頭番地が格納されているアドレスを示す．そのアドレスがプログラム実行開始時にプ
ログラムレジスターPRにセットされる．それを確実にするために，\tw{START}命令がある．
この命令で，最初に実行させる命令を示すのである．CPUは，その番地に書かれた0と1の
集まりは命令と解釈する．

\tw{START}命令など無くして，最初の行から実行するように約束することも出来るであろ
う．こうすると，いつも先頭の行から実行することになり，実際プログラムを書く場合不
便なことがある．\tw{START}命令が有った方が，便利なのである．

もし，オペランド欄に記述が無い場合，\tw{START}命令の次の行からプログラムの実行は
開始することになっている．START命令のラベルは，そのプログラム自身で参照されるこ
とはないが，絶対に必要である．ほかのプログラム，たとえばOSがプログラムの実行を指
示する場合，このラベルが使われる．そしてこのラベルが示すアドレスは，このプログラ
ムの実行開始番地になる．したがって，図1のラベル\tw{PGM}と\tw{BEGIN}は同じアドレ
ス\tw{\#0020}である．
%
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]
  {figure/program_memory.eps}
  \caption{メモリーの内容と命令の種類}
  \label{fig:memory_command}
 \end{center}
\end{figure}
%

%---------------------------------------------------------------------
\subsection{プログラムの終わり(END)}
%---------------------------------------------------------------------
%
\begin{screen}
 \textbf{\Large 書式}\hspace{10mm}
 \begin{tabular}{lll}\hline
  \textbf{\footnotesize ラベル欄}　 & 
  \textbf{\footnotesize 命令コード欄} & 
  \textbf{\footnotesize オペランド欄} \\ \hline 
         & \tw{END} & \\ \hline
 \end{tabular}
\end{screen}
%
\begin{itemize}
 \item{プログラムの最後に，必ず\tw{END}命令を書かなくてはならない．}
 \item{ラベル欄とオペランド欄は，書いてはならない．}
 \item{非実行文なので，フラグレジスタは変化しない(関係ない)．}
\end{itemize}

この命令の役割は，プログラムの終わりをアセンブラーに対して知らせることである．プ
ログラムの最後に必ず書く必要があり，これが無いと，どこでプログラムが終わったのか
分からない．プログラムの実行が終わったところではなく，プログラマーが記述したソー
スコードの終わりを示す．

\tw{END}文はラベルをつけることはできない．この命令は，主記憶装置に格納されないの
で，対応するアドレスが無いからである．また，処理の対象となるオペランドも無いので，
書くことはできない．しかし，\tw{END}文の後に注釈は許される．アセンブラーは，これ
は無視する\footnote{\tw{END}命令に限らず，どこにある注釈でもアセンブラーは無視す
る．注釈はプログラマーのためのものであり，アセンブラーはいっさい関知しない．}．
%
%
%=====================================================================
\section{定数の定義(\tw{DC})}
%=====================================================================
%---------------------------------------------------------------------
\subsection{内容}
%---------------------------------------------------------------------
以前から述べているように，プログラムは命令とデータから構成させれる．このうちデー
タを書き表すために，\tw{DC}が使われる．これは Define Constantの略で，定数を定義
するように思えるが，実際はメモリーを確保して初期化しているだけである．したがって，
定数と言いながら，メモリーの内容は書き換え可能である．
%---------------------------------------------------------------------
\subsection{書式と例}
%---------------------------------------------------------------------
DC:Define Constant
%
\begin{screen}
 \textbf{\Large 書式}\hspace{10mm}
 \begin{tabular}{lll}\hline
  \textbf{\footnotesize ラベル欄}　 & 
  \textbf{\footnotesize 命令コード欄} & 
  \textbf{\footnotesize オペランド欄} \\ \hline 
  \tw{[label]} & \tw{DC} & \textit{n} \\
  \tw{[label]} & \tw{DC} & \tw{\#}\textit{h} \\
  \tw{[label]} & \tw{DC} & \tw{'}\textit{文字列}\tw{'} \\
  \tw{[label]} & \tw{DC} & \textit{ラベル名} \\
  \tw{[label]} & \tw{DC} & \textit{定数}\tw{[}\textit{,定数,定数,}\tw{]}\\
  \hline
 \end{tabular}
\end{screen}
%
\begin{itemize}
 \item ラベル名は，確保された領域の先頭のアドレスである．
 \item ラベルは無くても良いが，データへのアクセスが煩雑になる．通常，ラベルを付
       けて，それを使ってデータにアクセスする．
 \item オペランド欄に書かれるデータは，以下の場合に分けられる．
       \begin{itemize}
	\item 10進数の整数(\textit{n})
	\begin{itemize}
	 \item 10進数整数のデータを定義する．CASL IIの場合，整数は16ビットで表される
	       ため，その範囲は-32768〜32767までである．これを超えた場合，その下
	       位16ビットがビットパターンに変換される．
	\end{itemize}
	\item 4桁の16進数の正の整数(\textit{h})
	\begin{itemize}
	 \item 16進数整数のデータを定義する．その範囲は\tw{\#0000}〜\tw{\#FFFF}
	       までである．
	\end{itemize}
	\item 文字列
	      \begin{itemize}
	       \item 文字列のデータを定義する．CASLでは1文字を16ビット(1ワード)で表現す
		     るが，JIS X 0201では8ビットで表現する．このことより，上位8ビットは
		     0とし，下位8ビットで表現することになっている．以前学習したとおりで
		     ある．
	       \item アポストロフィ「\tw{'}」をデータとして使いたい場合は，それを2つ続
		     けて「\tw{''}」のように書く．そうすると，1ヶのアポストロフィがデー
		     タとして定義される．
	       \item ラベルは，第一文字目のデータが格納されたアドレスを示す．
	      \end{itemize}
	\item ラベル名
	\begin{itemize}
	 \item アドレス定数とよばれるもので，記号番地であるラベル名をアドレスの
	       絶対番地メモリーに格納できる．指定されたラベル名の絶対番地がメモ
	       リーに格納される．
	\end{itemize}
	\item カンマ区切りの複数のデータ
	      \begin{itemize}
	       \item カンマで区切って，いくつでも定数を書くことができる．
	      \end{itemize}
       \end{itemize}
 \item 非実行文なので，フラグレジスタは変化しない(関係ない)．
       \end{itemize}
%

実際の例を以下に示す．特に説明するまでも無いだろ．
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
   AA  DC  100
   BB  DC  -3
   CC  DC  #0027
   DD  DC  'AT<&'
   EE  DC  AA
   FF  DC  10,20,'AB',#FFFF
 \end{verbatim}
\end{quote}
%
%
%=====================================================================
\section{領域の確保\tw{(DS)}}
%=====================================================================
%---------------------------------------------------------------------
\subsection{内容}
%---------------------------------------------------------------------
領域の確保の命令で，プログラムの実行に必要なメモリーの領域を確保する．実際のプロ
グラムでは，計算途中や結果のデータを格納するために，記憶領域が必要となる．
%---------------------------------------------------------------------
\subsection{書式と例}
%---------------------------------------------------------------------
DS:Define Storage
%
\begin{screen}
 \textbf{\Large 書式}\hspace{10mm}
 \begin{tabular}{lll}\hline
  \textbf{\footnotesize ラベル欄}　 & 
  \textbf{\footnotesize 命令コード欄} & 
  \textbf{\footnotesize オペランド欄} \\ \hline 
  \tw{[label]} & \tw{DS} & \textit{n} \\ \hline
 \end{tabular}
\end{screen}
%
\begin{itemize}
 \item ラベルは，無くても良いが，メモリー領域へのアクセスが複雑になるので，通常は付ける．
 \item \textit{n}は，10進数の整数である($0\leqq n$)．\textit{n}語分の領域を確保する．
 \item ラベル名は，確保された領域の先頭のアドレスである．
 \item 非実行文なので，フラグレジスタは変化しない(関係ない)．
\end{itemize}

以下に実際のプログラムで使われる例を示す．ここで，おもしろ使い方をしてるのが，ラ
ベル\tw{BB}の行である．メモリーはひとつも確保されないが，ラベル名がある．この場
合，\tw{BB}が示すアドレスは\tw{CC}が示すアドレスと同一になる．
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
   AA  DS  2
   BB  DS  0
   CC  DC  'AB'
 \end{verbatim}
\end{quote}
%
%
%=====================================================================
\bibliographystyle{jplain}
\bibliography{reference}
%=====================================================================
\end{document}



