%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
%    CASL IIの命令の種類とプログラムの書き方
%      last updated 2004.7.12
%        created by  Masashi Yamamoto
%        e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,float,misc,lgrind,float}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm　奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm　偶数ページ
\textwidth 160mm
%
\newcommand{\tw}[1]{\texttt{#1}}
%
\begin{document}
\title{CASL IIの命令の種類とプログラムの書き方}
\date{2005年11月25日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{先週の復習と本日の学習}
%=====================================================================
%---------------------------------------------------------------------
\subsection{先週の復習}
%---------------------------------------------------------------------
%------------------------
\subsubsection{レジスター}
%------------------------
COMET IIは主にCPUとメモリーから構成され，CPUはデータの処理を行い，メモリーはプロ
グラム(命令とデータ)を格納する．CPUの中にも小さいながらも記憶装置があり，それを
レジスターと言う．COMET IIには，次の4つのレジスターがある．

\paragraph{汎用レジスター(GR)}16ビットの記憶容量があり，8個(\tw{GR0}〜\tw{GR7})
用意されている．主に，データの処理(計算)に用いられ，プログラマーがもっとも多用す
るレジスターである．

\paragraph{フラグレジスター(FR)}1ビットのレジスターが3個用意
(\tw{OF},\tw{SF},\tw{ZF})\footnote{それぞれ，Overflow Flag, Sign Flag, Zero Flag
の略．}されている．計算結果の状態を示す．\tw{OF}は計算結果がメモリーに収まらなかっ
たときに1(ビットが立つと言う)になる．\tw{SF}は計算結果が負(第15ビットが1)になっ
たとき，\tw{ZF}は計算結果がゼロ(全てのビットが0)のとき1になる．

\paragraph{プログラムレジスター(PR)}コンピューターが次に実行する命令の先頭アドレ
スが格納されている．アドレスを格納するので記憶容量は16ビットである．CPUに中に1つ
ある．

\paragraph{スタックポインター(SP)}スタックというデータ構造を使う場合，その最上段
のアドレスを格納する．これについては，後の講義で詳しく説明する．

実際のプログラムを作成する場合，指標レジスターと言うものもつかわれ，それは汎用レ
ジスターの\tw{GR1}〜\tw{GR7}が代用される．基準
のアドレスからある値シフトして目的のアドレスを表すときの，オフセット値が指標レジ
スターに格納される．

ともあれ，プログラマーが覚えて置かなくてはならないのは，汎用レジスターとフラグレ
ジスター，そして指標レジスターの使い方である．
%
%------------------------------------
\subsubsection{命令をマシン語にする方法}
%------------------------------------
教科書の命令語の構成(p.213)を使って，命令をマシン語(0と1のビットパターン，または
16進数)に変換する方法を学習した．これは，課題が出来ていれば大丈夫．
%
%---------------------------------------------------------------------
\subsection{本日の学習内容}
%---------------------------------------------------------------------
本日から，本格的にアセンブラ言語CASL-IIの書き方(文法およびアルゴリズム) の学習を
行う．CASL IIという特定のアセンブラ言語について学習することになるが，他のアセン
ブラ言語でも似ている．これをちゃんと習得しておけば，今後，他のアセンブラ言語を使
うことになっても，短期間に理解できるであろう．

そこで，本日は，CASL-IIの命令の種類とその書き方を学習する．本日のゴー
ルは，
%
\begin{itemize}
 \item{ソースプログラムを機械語に翻訳するアセンブラーの仕事が分かる．}
 \item{CASL IIの命令の種類が理解できる．}
 \item{CASL IIのプログラムの書き方が理解できる．}
\end{itemize}
%
である．
%
%=====================================================================
\section{アセンブラーの仕事}
%=====================================================================
本日の授業のテーマである「CASL IIの命令の種類とプログラムの書き方」を理解するた
めには，アセンブラーの仕事を理解する必要がある．そのためには，ある程度プログラム
の作成順序が分からなくてはなくてはならない．図\ref{fig:make_program}に, アセンブ
ラ言語でのプログラムの作成手順を示す．作業の中心は，
%
\begin{enumerate}
 \item テキストエディターにより，アセンブラ言語でソースプログラムを記述し，ソー
       スファイルを作成する．
 \item アセンブラーにより，ソースファイルを機械語の実行ファイルに変換する．
\end{enumerate}
%
である．
%
\begin{screen}
 アセンブラーの役目は，人間が分かるアセンブラ言語で書かれたソースファイルをマシン
 語に変換することにより，実行ファイルを作る．
\end{screen}
%
アセンブラーとはこのような仕事をするプログラムである．その様子を図
\ref{fig:assembler}に示す\footnote{実際のアセンブラ言語ではもう少し
複雑ことを行い，実行プログラムが作られる．}．何のことはない，先週の諸君の課題で
アセンブラ言語をマシン語に直すのと同じで，アセンブラーはそれをやっているのである．

ただし，このプログラムは，\textbf{メモリーの\tw{\#0020}からロードされた場合}とし
ているので注意が必要である．
%
\begin{center}
 \begin{figure}[H]
  \begin{tabular}{cc}
   %---- プログラム作成のフローチャート -----------------
   \begin{minipage}[b]{0.5\hsize}
    \begin{center}
     \includegraphics[keepaspectratio, scale=0.8]
     {figure/make_program.eps}
     \caption{プログラム作成のフローチャート}
     \label{fig:make_program}
    \end{center}
   \end{minipage} &
   %---- アセンブル -------------------
   \begin{minipage}[b]{0.5\hsize}
   \begin{center}
    \includegraphics[keepaspectratio, scale=0.8]
    {figure/assembler.eps}
    \caption{アセンブラ言語からマシン語への変換}
    \label{fig:assembler}
   \end{center}
   \end{minipage}
  \end{tabular}
 \end{figure}
\end{center}
%
%
%=====================================================================
\section{CASL IIの命令の種類}
%=====================================================================
CASL IIの命令を大きき分けると，アセンブラ命令と機械語命令，マクロ命令の3種類ある．
プログラムを書く場合，これらがどのようになっているか，理解する必要がある．命令の
具体的な内容は，次回以降の授業で学習すが，ここでは簡単に概要を述べる．
%
%---------------------------------------------------------------------
\subsection{アセンブラ命令}
%---------------------------------------------------------------------
教科書のP.28〜P.35で説明している非実行文と書かれているものである．アセンブラーと
いう変換プログラムに対して，いろいろな指示を行う命令である．プログラム実行時には，
COMET IIのCPUの動作の指示は行う命令ではない．したがって，この命令は機械語に変換
されて特定のビットパターン(1と0の組み合わせ)に変換されることはない．

CASL IIには，次の4個のアセンブラ命令がある．\vspace{3mm}

\begin{tabular}{llp{100mm}}
 \hspace{10mm} & START & プログラムの先頭を定義\\
               &       & プログラムの実行開始番地を定義\\
               &       & 他のプログラムで参照する入口名を定義\\
               & END   & プログラムの終わりを明示\\
               & DC    & 定数を定義\\
               & DS    & 領域を確保
\end{tabular}\\
%
ただし，\tw{DC}命令は，それに引き続く値にビットパターンに変換される．
\tw{DS}命令はビットパターンに変換されないが，必要な領域を確保する．こ
の2つは，FORTRANの変数宣言と同じような働きをする．実際のプログラムでは，
データの値を定義することに使われる．
%
%---------------------------------------------------------------------
\subsection{機械語命令}
%---------------------------------------------------------------------
教科書のP.40〜P.82で説明している．この命令は，COMET IIのCCPUの動作の指
示を行う．そのため，この命令に対応した論理回路が，CPUの中に組み込まれ
ている．これら命令は，アセンブラーにより特定のビットパターンの機械語に
変換され，そのパターンに従い，論理回路が動作する．

実行時には，そのビットパターンが主記憶装置に格納されている．ビットパター
ンへの変換は，先々週の授業で説明したハンドアセンブラーと同じことをする．

CASL IIには，以下の28個の機械語命令がある(教科書のP.203)．
\vspace{3mm}

\begin{tabular}{llp{100mm}}
 \hspace{10mm} & \tw{LD, ST, LAD}                   & データの移動\\
               & \tw{ADDA, SUBA, ADDL, SUBL}        & 算術演算\\
               & \tw{AND, OR, XOR}                  & 論理演算\\
               & \tw{CPA, CPL}                      & 比較演算\\
               & \tw{SLA, SRA, SLL, SRL}            & シフト演算 \\
               & \tw{JPL, JMI, JNZ, JZE, JOV, JUMP} & 分岐処理\\
               & \tw{PUSH, POP}                     & スタック操作\\
               & \tw{CALL, RET}                     & サブルーチンの呼び出しと戻り\\
               & \tw{SVC, NOP}                      & その他
\end{tabular}
%
%---------------------------------------------------------------------
\subsection{マクロ命令}
%---------------------------------------------------------------------
教科書のP.83〜P.86で説明している．マクロ命令とは，特定の機能を果たす，
いくつかの機械語命令の集まりに名前を付けたものである．この名前を指定す
るだけで，これらの命令の集まりが実行できる．これにより，頻繁に使われる
定形的な命令群をマクロ命令にすることにより，同じようなプログラムをいち
いち書くことを省くことができ，便利である．

多くの命令から構成されるため，アセンブラーにより変換されるビットパター
ンは非常に多くなる．

CASL IIには，以下の4個のマクロ命令がある(教科書のP.203)．

\vspace{3mm}

\begin{tabular}{llp{120mm}}
 \hspace{10mm} & \tw{IN}    &
 入力装置(キーボード)から，文字データを読み込む\\
               & \tw{OUT}   &
 出力装置(ディスプレイ)に，文字データを書き込む\\
               & \tw{RPUSH} &
 汎用レジスターの内容を，\tw{GR1, GR2, $\cdots$,GR7}の順でスタックに格納\\
               & \tw{RPOP}       &
 スタックの内容を\tw{GR7, GR6, $\cdots$
 ,GR1}の順で汎用レジスターに格納
\end{tabular}
%
%=====================================================================
\section{プログラム例(加算演算)}
%=====================================================================
それでは，命令の種類と，それがどのようにメモリーに格納される調べる．そ
のためには，実際のプログラムで，それを見るのが良いであろう．次のような
CASL IIのプログラムを考ることにする．これで，CASL IIの3種類の命令の違
いを理解する．
%
\begin{itemize}
 \item{加算をするプログラムである．内容は，
      \begin{itemize}
       \item{加算をする3と5をメモリーに格納しておきます．}
       \item{それを引き出して，加算を行います．}
       \item{加算の結果を，メモリーに戻します．}
       \item{そして，最後に"END"と出力装置に表示します．}
      \end{itemize}
      である．}
\end{itemize}
%
これを実現するCASL IIのプログラムは，図
\ref{fig:flow_chart_all_types_commands}のようになる．合わせて，フロー
チャートも示しているので，内容を理解すること．

実行文ではないため，フローチャートには書かなかったが，命令コードの
\tw{DC}と\tw{DS}には，\vspace{3mm}

\begin{tabular}{lllp{120mm}}
 %
 \hspace{10mm} & \tw{A  DC  3}     & \hspace{5mm} &
 アドレス\tw{A}に数値の3を格納 \\
 %
               & \tw{D  DC  'END'} &              &
 アドレスDに文字\tw{'E'}を格納 \\
 %
               &                   &              &
 続いて，アドレス\tw{D+1}に文字\tw{'N'}を格納 \\
 %
               &                   &              &
 最後に，アドレス\tw{D+2}に文字\tw{'D'}を格納 \\
 %
               & \tw{C DS 1}       &              &
 アドレスCを先頭に，1ワード分のメモリー領域を確保 \\
 %
\end{tabular}\vspace{3mm}\\
の役割がある．これは，アセンブラーがメモリーの中身を決めたり，確保
するために必要である．

それでは，このCASL IIがアセンブラーでどのように機械語に変換されるか見
る．シミュレーターWCASL-II\footnote{COMET IIをWindows上で擬似的に動作さ
せるプログラムである．}で変換すると，図\ref{fig:memory_command}のよう
なマシン語になる．以下のことが重要である．
%
\begin{itemize}
 \item アセンブラ命令は，マシン語に変換されていない．ただし，\tw{DC}はデータに変
       換され，\tw{DS}はメモリーが予約され適当な値が格納される．
 \item 機械語命令は，1対1の対応でマシン語に変換される．対応については，前回のハ
       ンドアセンブルで，学習した通りである．
 \item マクロ命令は，複数のマシン語に変換される．変換されるマシン語は，OSやアセ
       ンブラーに依存する．したがって，マクロ命令のマシン語への変換については，
       ここでの学習の範囲外である．この変換を考えるためには，OSとアセンブラーの
       設計が必要である．
\end{itemize}
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.8]
  {figure/flow_chart.eps}
  \caption{アセンブラ命令，機械語命令，マクロ命令があるプログラム例と
  フローチャート}
  \label{fig:flow_chart_all_types_commands}
 \end{center}
\end{figure}
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.8]
  {figure/program_memory.eps}
  \caption{メモリーの内容と命令の種類}
  \label{fig:memory_command}
 \end{center}
\end{figure}
%
%=====================================================================
\section{CASL IIのプログラムの書き方}
%=====================================================================
%---------------------------------------------------------------------
\subsection{コーディングの約束}
%---------------------------------------------------------------------
コーディングとはプログラムを記述する作業のことである．本節では，CASL
IIのプログラムの書き方の約束を示す．FORTRANでもプログラムの書き方があっ
たように，CASL IIでも約束がある．FORTRANでは各桁は，コメントのしるし(*
or C)を書く欄(第1桁)や文番号を書く欄(第1〜5桁)，継続のしるしを書く欄
(第6 桁)，文を書く欄(第7〜72桁)と役割分担がある．それと同じように，
CASL IIでも行は機能毎に欄が分かれている．例えば，先ほどのプログラム
を例に取ると，図\ref{fig:description_code}のようになる．

各欄はFORTRANのように桁数で分けられているわけではない．機能別の欄の区
切りは，1 個以上の空白である．
%
\begin{itemize}
 \item{ラベル欄の先頭の空白は許されない．空白があると，それはラベル
      ではなく命令コードと解釈される．}
 \item{各行の命令コード欄やオペランド欄，注釈欄の書き始めをそろえる必
      要はない．しかし，各欄の書き始めの位置はそろえたほうが，プ
      ログラムは分かりやすくなる．できるだけ，そろえたほうが良い．}
\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}
%
%---------------------------------------------------------------------
\subsection{機能別の各欄の説明}
%---------------------------------------------------------------------
%-----------------------
\subsubsection{ラベル欄}
%-----------------------
ラベルは，その記述する位置からFORTRANの文番号にも似ている．あるいは，
いままでの例でもわかるように，変数名の役割を果たしている．実際，プログ
ラムでは，FORTRANの文番号や変数名のような使われ方をする．実際のところ，
マシン語の奥底では，それはアドレスを表す．そのアドレスは，それ引き続く
命令に従い，次のように決まっている．
%
\begin{itemize}
 \item{機械語命令のラベルの場合は，その機械語命令が格納されている2語分
      の領域のうち，その先頭アドレスを表す．実際のプログラムでは，ジャ
      ンプ命令とともに使われ，そのアドレスに制御が移る．FORTRANの
      \tw{GO TO} 文でその文番号に制御が移るのと同じである．}
 \item{\tw{DC}命令 の場合，ラベルは定数が格納されている領域 の先頭アド
      レスを示す．使い方はFORTRANの変数名に似ているが，実態はアドレス
      である．}
 \item{\tw{DS}命令の場合，ラベルはこの命令によって確保されている主記憶の領
      域の先頭アドレスを表す．}
 \item{\tw{IN}や\tw{OUT}のマクロ命令の場合は，ラベルは複数の命令群のうちの先頭の
      命令が格納されているアドレスを示す．}
\end{itemize}
%
ラベルがアドレスを表すことが理解できれば，簡単である．常識通りに解釈
すればよいのである．

教科書にも書かれている通り，ラベルの記述の約束は以下の通りである．
%
\begin{itemize}
 \item{プログラムのロジックでラベルが不要な場合は，記述しなくても良い．}
 \item{ラベルは，8文字以内で記述する．先頭はアルファベットの大文字，2
      文字以降はアルファベットの大文字，数字いずれでも良い．}
 \item{必ず先頭(第1文字)から始める．第1文字が空白の場合は，ラベル名
      は無いものみなされ，命令コードと解釈される．}
 \item{汎用レジスタの名前のGR0からGR7は予約語であり，ラベル名として使
      用できない．命令コードのオペランドで，ラベルなのかレジスタなの
      か区別できなくなるためである．}
\end{itemize}
%

\begin{screen}
%
\textbf{重要なポイント}

\hspace*{1zw}以前学習した通りアセンブラのプログラムは，主記憶装置(メイ
ンメモリー)の中に格納されているデータを処理(いろいろな演算)する．ま
た，プログラムの命令も主記憶装置に格納されている．主記憶装置に格納さ
れているデータや命令にアクセスする場合，主記憶装置のアドレスを指定する
ことになる．したがって，アセンブラでは，アドレスが重要になり，プロ
グラマーは意識しなくてはならない．

\hspace*{1zw}高級言語の場合，アドレスに関してはコンパイラーが勝手に処
理をする．ありがたいものである．例えば，FORTRANで変数を使った場合，プ
ログラマーがその変数のアドレスに注意を払う必要はない．これは，コンパイ
ラーが変数とアドレスの関係の表を持っており，それに従い，上手にマシン語
に変換してくれているのである．

\hspace*{1zw}アセンブラのでは，コンパイラーの代わりにプログラマーが変
数とアドレスの関係を考えなくてはならない．そんなに難しくない．
%
\end{screen}
%
%---------------------------
\subsubsection{命令コード欄}
%---------------------------
この欄には，アセンブラ命令(非実行文)，機械語命令，マクロ命令を書く．
教科書にも書かれている通り，記述の約束は以下の通りである．
%
\begin{itemize}
 \item{ラベルの後に1個以上の空白の後，命令コードを書く．}
 \item{ラベルが無い場合は，命令コードの前に1個以上の空白の後，記述する．}
\end{itemize}
%
%
%---------------------------
\subsubsection{オペランド欄}
%---------------------------
この欄には，命令のオペランドを記述する．オペランド(operand：被演算子) 
とは，命令の対象となるアドレスやレジスタ，データのことである．CASL II 
では汎用レジスタ番号，記号番地(ラベルのこと)，あるいは絶対番地，文字，
整数がオペランドとなる．その記述方法は，教科書に書かれているように，以
下の通りである．
%
\begin{itemize}
 \item{命令コードの後に1個以上の空白の後，オペランドを書く．}
 \item{複数のオペランドは，カンマ\tw{","}で区切って，連続して書く．}
\end{itemize}
%
%
%---------------------
\subsubsection{注釈欄}
%---------------------
行中にセミコロン\tw{";"}を書くことのより，それから行末まで注釈(コメン
ト)として扱うことができる．FORTRANの注釈文と同じで，プログラムの実行に
何ら影響を与えない．プログラムの内容を分かりやすくするために書くことが
多い．あるいは，その行を実行させないときに行頭にセミコロンを\tw{";"}を
追加してデバック作業を進める\footnote{コメントアウトすると言う}ことがある．
%
\begin{itemize}
 \item{行の先頭，あるいはセミコロンの前に空白しかない場合は，行全体が
      注釈となる．}
 \item{オペランドの後に1個以上の空白があれば，そこ以降も注釈となる．}
\end{itemize}
%%=====================================================================
\end{document}



