%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
%    マクロ命令
%      last updated 2006.1.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}
\usepackage{url}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm　奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm　偶数ページ
\textwidth 160mm
%
\newcommand{\tw}[1]{\texttt{#1}}
\newcommand{\vbt}[1]{\begin{verbatim} #1 \end{verbatim}}
\newcounter{linenum}
\newcommand{\wrtlinenum}{\multicolumn{1}{|r|}{\arabic{linenum}}
   \addtocounter{linenum}{1}}
%
\newcounter{toi_num}
\newcommand{\toi}{\textbf{\texttt [問\arabic{toi_num}]}
   \addtocounter{toi_num}{1}}
%
%
\begin{document}
\title{マクロ命令}
\date{2005年1月31日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{学習内容}
%=====================================================================
これまでの講義で，アセンブラ命令と機械語命令の学習を終えた．最後に残ったマクロ命
令をここで学習する(教科書~\cite{text_casl2}のp.83〜p.86)．その前に，CASL IIの命令について，再度，見直しておく．

\begin{quote}
 \textbf{アセンブラ命令}\qquad
 教科書では，非実行文と書かれているものである．アセンブラーと
 いう変換プログラムに対して，いろいろな指示を行う命令である．プログラム実行時には，
 COMET IIのCPUの動作の指示は行う命令ではない．したがって，この命令は機械語に変換
 されて特定のビットパターン(1と0の組み合わせ)に変換されることはない．\\
 \begin{tabular}{llp{100mm}}
  \hspace{10mm}
  & START & プログラムの先頭を定義\\
  &       & プログラムの実行開始番地を定義\\
  &       & 他のプログラムで参照する入口名を定義\\
  & END   & プログラムの終わりを明示\\
  & DC    & 定数を定義\\
  & DS    & 領域を確保
 \end{tabular}\\
 ただし，\tw{DC}命令は，それに引き続く値にビットパターンに変換される．
 \tw{DS}命令はビットパターンに変換されないが，必要な領域を確保する．こ
 の2つは，FORTRANの変数宣言と同じような働きをする．実際のプログラムでは，
 データの値を定義することに使われる．
\end{quote}

\begin{quote}
 \textbf{機械語命令}\qquad
 COMET IIのCPUに動作の指示を行う．そのため，この命令に対応した論理回路が，CPUの
 中に組み込まれている．これら命令は，アセンブラーにより特定のビットパターンの機械
 語に変換され，そのパターンに従い，論理回路が動作する．実行時には，そのビットパター
 ンが主記憶装置に格納されている．\\
 \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}
\end{quote}

\begin{quote}
 \textbf{マクロ命令}\qquad
 マクロ命令とは，特定の機能を果たす，いくつかの機械語命令の集まりに名前を付けたも
 のである．この名前を指定するだけで，これらの命令の集まりが実行できる．これにより，
 頻繁に使われる定形的な命令群をマクロ命令にすることにより，同じようなプログラムを
 いちいち書くことを省くことができ，便利である．多くの命令から構成されるため，アセ
 ンブラーにより変換されるビットパターンは非常に多くなる．\\
 \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}
\end{quote}
%
%=====================================================================
\section{マクロ命令}
%=====================================================================
%---------------------------------------------------------------------
\subsection{入出力関係}
%---------------------------------------------------------------------
通常，入出力関係を伴ったしょりにはキーボードやディスプレイのハードウェアーの制御
が必要である．COMET IIでそれらを制御するとなると，非常にプログラムが難しくなる
\footnote{簡単にする方法もあるが，ここではそこまで踏み込まない．ハードウェアが関
わる問題となる}．そこで，CASL IIにはマクロという形でそれを実現している．マクロも
機械語命令の集まりであるが，プログラマーはそんなことを気にしないで，通常の命令と
同じように使うことができる．
%--------------------------------------
\subsubsection{入力命令(\tw{IN})}
%-------------------------------------
CASL IIでは，データの入力方法は2通りある．以前学習した\tw{DC}とここで示す\tw{IN}
である．\tw{DC}ではデータはプログラム中に記述し，アセンブル時にビットに変換され，
実行時にメモリーにロードされる．それに対して，\tw{IN}は実行時にキーボードから入
力されたデータをメモリーに格納する．
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{IN} \\
  \textbf{語源}   & \textbf{IN}put\hspace{5mm}(return:入力)\\
  \textbf{役割}     & 入力装置(通常はキーボード)から文字列を読み込む．\\
  \textbf{書式}     & [ラベル]\hspace{5mm}\tw{IN}\hspace{5mm}ラベル1,ラベル2 \\
  \textbf{機能}     & 入力装置から1レコード(256語)分のデータが，ラベル1で指定さ
  れた入力領域に入力される．読み込まれた文字数はラベル2の領域にセットされる．ファ
  イルの終わりを検出した場合(データがない場合)，ラベル2には-1がセットされる．\\
  \textbf{フラグレジスタ} & アセンブラーに依存．
 \end{tabular}
\end{quote}
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
       IN    TEXT,NUM         ;キーボードからデータを読み込む
 \end{verbatim}
\end{quote}
この命令では，必ず読み込んだデータと文字数を格納する主記憶の領域を確保しなくては
ならない．すなわち，以下が必要である．
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	TEXT   DS    256         ;データ領域，1レコード予約する
	NUM    DS    1           ;読み込み文字数を入れる
 \end{verbatim}
\end{quote}
データ領域として，1ワード以外の値を指定した場合，エラーになるか否かはアセンブラー
に依存するであろう．シミュレーター WCASL-IIではエラーにならなかった．
%
%--------------------------------------
\subsubsection{出力命令(\tw{OUT})}
%-------------------------------------
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{OUT} \\
  \textbf{語源}   & \textbf{OUT}put\hspace{5mm}(return:入力)\\
  \textbf{役割}     & 出力装置(通常はディスプレイ)に文字列を書き出す．\\
  \textbf{書式}     & [ラベル]\hspace{5mm}\tw{OUT}\hspace{5mm}ラベル1,ラベル2 \\
  \textbf{機能}     & データをラベル2で指定された文字数出力装置に書き出す．\\
  \textbf{フラグレジスタ} & アセンブラーに依存．
 \end{tabular}
\end{quote}
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
       OUT    TEXT,NUM         ;ディスプレイに文字を書き出す
 \end{verbatim}
\end{quote}
この命令では，メモリーに格納されているデータは文字として取り扱われる．数値を表示
させるときには工夫が必要である．それについては，以降の学習範囲である．
%
%---------------------------------------------------------------------
\subsection{レジスター関係}
%---------------------------------------------------------------------
レジスターのデータの待避と復元には，機械語命令の\tw{PUSH}と\tw{POP}を使うことが
できる．これは，レジスターひとつずつを処理するため，頻繁に多くのレジスターを取り
扱う場合，プログラムが長くなり不便である．そこで，汎用レジスターの\tw{GR1}〜
\tw{GR7}まで，一度の待避と復元ができるマクロ命令が用意されている．
%--------------------------------------
\subsubsection{レジスターの待避(\tw{RPUSH})}
%-------------------------------------
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{RPUSH} \\
  \textbf{語源}   & ???\\
  \textbf{役割}     & \tw{GR1}，\tw{GR2}, \tw{GR3}, $\cdots$, \tw{GR7}の順でス
  タック領域にデータをプッシュする．\\
  \textbf{書式}     & [ラベル]\hspace{5mm}\tw{RPUSH} \\
  \textbf{機能}     & スタックポインター(\tw{SP})の値を減らしながら，汎用レジス
  ターの値をプッシュする．\\
  \textbf{フラグレジスタ} & アセンブラーに依存．
 \end{tabular}
\end{quote}
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
       RPUSH              ;レジスターのデータの待避
 \end{verbatim}
\end{quote}
%--------------------------------------
\subsubsection{レジスターの復元(\tw{RPOP})}
%-------------------------------------
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{RPOP} \\
  \textbf{語源}   & ???\\
  \textbf{役割}     & スタック領域のデータをポップし，\tw{GR7}，\tw{GR6},
  \tw{GR5}, $\cdots$, \tw{GR1}の順でレジスターに入れる．\\
  \textbf{書式}     & [ラベル]\hspace{5mm}\tw{RPUSH} \\
  \textbf{機能}     & スタックポインター(\tw{SP})の値を増やしながら，汎用レジス
  ターの値をポップする．\\
  \textbf{フラグレジスタ} & アセンブラーに依存．
 \end{tabular}
\end{quote}
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
       RPOP              ;レジスターのデータの復元
 \end{verbatim}
\end{quote}
%
%=====================================================================
%  参考文献
%=====================================================================
\bibliographystyle{jplain}
\bibliography{reference}
%=====================================================================
\end{document}



