%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
%    シフト命令
%      last updated 2004.11.14
%        created by  Masashi Yamamoto
%        e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,float,float}
\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}}
%
\begin{document}
\title{まとめ(CASL IIの命令)}
\date{2006年2月2日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{命令の種類}
%=====================================================================
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のCPUの動作の指
示を行う．そのため，この命令に対応した論理回路が，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{SLA, SRA, SLL, SRL}            & シフト演算\\
               & \tw{CPA, CPL}                      & 比較演算\\
               & \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のプログラムの書き方}
%=====================================================================
%---------------------------------------------------------------------
\subsection{コーディングの約束}
%---------------------------------------------------------------------
コーディングとはプログラムを記述する作業のことである．ここでは，CASL IIのプログ
ラムの書き方の約束を示す．

CASL IIのプログラムの1行は，ラベル欄と命令コード欄，オペランド欄，注釈欄と機能毎
に欄が分かれている．具体的には，図\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の
文番号や変数名のような使われ方をする．実際には，CASL IIでは，それはアドレスを表
す．そのアドレスは，それ引き続く命令に従い，次のように決まっている．
%
\begin{itemize}
 \item{機械語命令のラベルの場合は，その機械語命令が格納されている2語分の領域のう
      ち，その先頭アドレスを表す．実際のプログラムでは，ジャンプ命令とともに使わ
      れ，そのアドレスに制御が移る．FORTRANの\tw{GO TO} 文でその文番号に制御が移
      るのと同じである．}
 \item{\tw{DC}命令 の場合，ラベルは定数が格納されている領域 の先頭アドレスを示す．
      使い方はFORTRANの変数名に似ているが，実態はアドレスである．}
 \item{\tw{DS}命令の場合，ラベルはこの命令によって確保されている主記憶の領
      域の先頭アドレスを表す．C言語の配列の宣言と同じである．}
 \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{";"}を
追加してデバック作業を進めることがある．
%
\begin{itemize}
 \item{行の先頭，あるいはセミコロンの前に空白しかない場合は，行全体が
      注釈となる．}
 \item{オペランドの後に1個以上の空白があれば，そこ以降も注釈となる．}
\end{itemize}
%
%=====================================================================
\section{命令一覧}
%=====================================================================
%---------------------------------------------------------------------
\subsection{アセンブラ命令}
%---------------------------------------------------------------------
\footnotesize{
\begin{tabular}{|p{20mm}|p{30mm}|p{50mm}|p{40mm}|}
 \hline
 %
 \multicolumn{1}{|c|}{機能} &
 \multicolumn{1}{c|}{書式} &
 \multicolumn{1}{c|}{動作内容} &
 \multicolumn{1}{c|}{フラグレジスタの変化}\\
 \hline\hline
 %
 プログラム開始 &
 \tw{START [実行開始番地]} &
 プログラムの開始を示す．プログラムの最初に，必ず書かなくてはならない．&
 \\
 \hline
 %
 プログラム終了 &
 \tw{END} &
 プログラムの終わりを示す．ラベルは使えない．プログラムの最後に，必ず書かなくて
 はならない． &
 \raisebox{0pt}[0pt][0pt]{} \\
 \hline
 %
 \raisebox{0pt}[0pt][0pt]{定数格納} &
 \tw{DC n} &
 10進定数をラベルのアドレスに格納 &
 \\
 \cline{2-3}
 %
 &
 \tw{DC \#h} &
 16進定数をラベルのアドレスに格納 &
 \\
 \cline{2-3}
 %
 &
 \tw{DC '文字列'} &
 文字列をラベルのアドレスから格納 &
 \\
 \cline{2-3}
 %
 &
 \tw{DC ラベル名} &
 ラベル名が示すアドレスを格納&
 \\
 \hline
 %
 領域の確保 &
 \tw{DS n} &
 ラベル名で示すアドレスからn語領域を確保 &
 \\
 \hline
 %
\end{tabular}
}
%

注意
\begin{itemize}
\item アセンブラ命令ではフラグレジスタの値はセットされることはない．これは，アセ
      ンブラ命令はプログラム実行には動作しないためである．
\end{itemize}
%
\newpage
%---------------------------------------------------------------------
\subsection{機械語命令}
%---------------------------------------------------------------------
\footnotesize{
\begin{tabular}{|p{20mm}|p{25mm}|p{50mm}|p{55mm}|}
 \hline
 %----------------- 表項目 --------------
 \multicolumn{1}{|c|}{機能} &
 \multicolumn{1}{c|}{書式} &
 \multicolumn{1}{c|}{動作内容} &
 \multicolumn{1}{c|}{フラグレジスタの変化}\\
 \hline\hline
 %----------------- ロード --------------
 \raisebox{0pt}[0pt][0pt]{ロード} &
 \tw{LD r1,r2} & レジスタr2の値をレジスタr1にコピー &
 \raisebox{-4zh}[0pt][0pt]{
 \begin{tabular}{ll}
  \multicolumn{2}{l}{コピーされた値に従い以下のようになる．} \\
  \tw{OF} & \tw{0:}常にゼロが設定される \\
  \tw{SF} & \tw{1:}負の時(第15ビットが\tw{1})\\
          & \tw{0:}正の時(第15ビットが\tw{0})\\
  \tw{ZF} & \tw{1:}ゼロの時(全てのビットが\tw{0})\\
          & \tw{0:}ゼロ以外
 \end{tabular}
 } \\ \cline{2-3}
 %
 &
 \tw{LD r,adr[,x]} &
 アドレス\tw{adr[,x]}の主記憶の内容をレジスタ\tw{r}にコピー \vspace{5zh}&
 \\
 \hline
 %----------------- ストア --------------
 ストア &
 \tw{ST r,adr[,x]} &
 レジスタrの内容を主記憶装置のアドレス\tw{adr[,x]}にコピーする &
 変化なし\\
 \hline
 %----------------- ロードアドレス --------------
 ロードアドレス &
 \tw{LAD r,adr[,x]} &
 主記憶装置のアドレス値\tw{adr[,x]}をレジスタrにコピーする． &
 変化なし \\
 \hline
 %----------------- 算術加算 --------------
 \raisebox{0pt}[0pt][0pt]{算術加算} &
 \tw{ADDA r1,r2} &
 レジスタ\tw{r1}と\tw{r2}の符号付き加算

 \tw{r1}$\leftarrow$\tw{r1+r2} &
 \raisebox{-4zh}[0pt][0pt]{
 \begin{tabular}{ll}
  \multicolumn{2}{l}{演算結果の値に従い以下のようになる．} \\
  \tw{OF} & \tw{1:}結果が\tw{-32768}〜\tw{32767}の範囲外 \\
          & \tw{0:}範囲内\\
  \tw{SF} & \tw{1:}負(第15ビットが\tw{1})\\
          & \tw{0:}正(第15ビットが\tw{0})\\
  \tw{ZF} & \tw{1:}ゼロ(全てのビットが\tw{0})\\
          & \tw{0:}ゼロ以外
 \end{tabular}
 } \\
 \cline{2-3}
 %
 &
 \tw{ADDA r,adr[,x]} &
 レジスタrと主記憶装置(アドレス\tw{adr[,x]})の内容を符号付加算
 
 \tw{r}$\leftarrow$\tw{r+adr[,x]}の内容 &
 \\
 \cline{1-3}
 %----------------- 算術減算 --------------
 \raisebox{0pt}[0pt][0pt]{算術減算} &
 \tw{SUBA r1,r2} &
 レジスタ\tw{r1}と\tw{r2}の符号付き減算

 \tw{r1}$\leftarrow$\tw{r1-r2} &
 \\
 \cline{2-3}
 %
 &
 \tw{SUBA r,adr[,x]} &
 レジスタ\tw{r}と主記憶装置(アドレス\tw{adr[,x]})の内容を符号付減算

 \tw{r}$\leftarrow$\tw{r-adr[,x]}の内容 &
 \\
 \hline
 %----------------- 論理加算 --------------
 \raisebox{0pt}[0pt][0pt]{論理加算} &
 \tw{ADDL r1,r2} &
 レジスタ\tw{r1}と\tw{r2}の符号無し加算

 \tw{r1}$\leftarrow$\tw{r1+r2} &
 \raisebox{-4zh}[0pt][0pt]{
 \begin{tabular}{ll}
  \multicolumn{2}{l}{演算結果の値に従い以下のようになる．} \\
  \tw{OF} & \tw{1:}結果が\tw{0}〜\tw{65535}の範囲外 \\
          & \tw{0:}範囲内\\
  \tw{SF} & \tw{1:}第15ビットが\tw{1})のとき\\
          & \tw{0:}第15ビットが\tw{0})のとき\\
  \tw{ZF} & \tw{1:}ゼロ(全てのビットが\tw{0})\\
          & \tw{0:}ゼロ以外
 \end{tabular}
 } \\
 \cline{2-3}
 %
 &
 \tw{ADDL r,adr[,x]} &
 レジスタrと主記憶装置(アドレス\tw{adr[,x]})の内容を符号無し加算
 
 \tw{r}$\leftarrow$\tw{r+adr[,x]}の内容 &
 \\
 \cline{1-3}
 %----------------- 論理減算 --------------
 \raisebox{0pt}[0pt][0pt]{論理減算} &
 \tw{SUBL r1,r2} &
 レジスタ\tw{r1}と\tw{r2}の符号無し減算

 \tw{r1}$\leftarrow$\tw{r1-r2} &
 \\
 \cline{2-3}
 %
 &
 \tw{SUBL r,adr[,x]} &
 レジスタ\tw{r}と主記憶装置(アドレス\tw{adr[,x]})の内容を符号無し減算

 \tw{r}$\leftarrow$\tw{r-adr[,x]}の内容 &
 \\
 \hline
  %----------------- 論理積 --------------
 \raisebox{0pt}[0pt][0pt]{論理積} &
 \tw{AND r1,r2} &
 レジスタ\tw{r1}と\tw{r2}のビット毎の論理積を計算．結果は\tw{r1}に格納． &
 \raisebox{-4zh}[0pt][0pt]{
 \begin{tabular}{ll}
  \multicolumn{2}{l}{演算結果の値に従い以下のようになる．} \\
  \tw{OF} & \tw{0:}常にゼロが設定される． \\
  \tw{SF} & \tw{1:}第15ビットが\tw{1})のとき\\
          & \tw{0:}第15ビットが\tw{0})のとき\\
  \tw{ZF} & \tw{1:}ゼロ(全てのビットが\tw{0})\\
          & \tw{0:}ゼロ以外
 \end{tabular}
 } \\
 \cline{2-3}
 %
 &
 \tw{AND r,adr[,x]} &
 レジスタrと主記憶装置(アドレス\tw{adr[,x]})の内容のビット毎の論理積を計算．結果は
 \tw{r1}に格納． &
 \\
 \cline{1-3}
  %----------------- 論理和 --------------
 \raisebox{0pt}[0pt][0pt]{論理和} &
 \tw{OR r1,r2} &
 レジスタ\tw{r1}と\tw{r2}のビット毎の論理和を計算．結果は\tw{r1}に格納． &
 \\
 \cline{2-3}
 %
 &
 \tw{OR r,adr[,x]} &
 レジスタrと主記憶装置(アドレス\tw{adr[,x]})の内容のビット毎の論理和を計算．結果は
 \tw{r1}に格納． &
 \\
 \cline{1-3}
  %----------------- 排他的論理和 --------------
 \raisebox{0pt}[0pt][0pt]{排他的論理和} &
 \tw{XOR r1,r2} &
 レジスタ\tw{r1}と\tw{r2}のビット毎の排他的論理和を計算．結果は\tw{r1}に格納． &
 \\
 \cline{2-3}
 %
 &
 \tw{XOR r,adr[,x]} &
 レジスタrと主記憶装置(アドレス\tw{adr[,x]})の内容のビット毎の排他的論理和を計算．結果は
 \tw{r1}に格納． &
 \\
 \hline
  %----------------- 算術比較 --------------
 \raisebox{0pt}[0pt][0pt]{算術比較} &
 \tw{CPA r1,r2} &
 レジスタ\tw{r1}と\tw{r2}を符号付き整数として比較を行う．比較の結果は，\tw{FR}に設定．&
 \raisebox{-6zh}[0pt][0pt]{
 \begin{tabular}{ll}
  \multicolumn{2}{l}{2つの整数の比較(以下の演算)を行う．} \\
  \multicolumn{2}{l}{\hspace{5mm}\tw{r1-r2}}\\
  \multicolumn{2}{l}{\hspace{5mm}\tw{r-adr[,x]}の内容}\\
  \multicolumn{2}{l}{}\\
  \tw{OF} & \tw{0:}常にゼロが設定される． \\
  \tw{SF} & \tw{1:}負(第15ビットが\tw{1})のとき)\\
          & \tw{0:}正(第15ビットが\tw{0})のとき)\\
  \tw{ZF} & \tw{1:}等しい(全てのビットが\tw{0})\\
          & \tw{0:}等しくない
 \end{tabular}
 } \\
 \cline{2-3}
 %
 &
 \tw{CPA r,adr[,x]} &
 レジスタrと主記憶装置(アドレス\tw{adr[,x]})を符号付き整数として比較．比較の結果は，\tw{FR}に設定．&
 \\
 \cline{1-3}
  %----------------- 論理比較 --------------
 \raisebox{0pt}[0pt][0pt]{論理比較} &
 \tw{CPL r1,r2} &
 レジスタ\tw{r1}と\tw{r2}を符号無し整数として比較．比較の結果は，\tw{FR}に設定． &
 \\
 \cline{2-3}
 %
 &
 \tw{CPL r,adr[,x]} &
 レジスタrと主記憶装置(アドレス\tw{adr[,x]})を符号無し整数として比較．比較の結果は，\tw{FR}に設定．&
 \\
 \hline
 %
\end{tabular}
}

\footnotesize{
\begin{tabular}{|p{20mm}|p{25mm}|p{50mm}|p{55mm}|}
 \hline
 %----------------- 表項目 --------------
 \multicolumn{1}{|c|}{機能} &
 \multicolumn{1}{c|}{書式} &
 \multicolumn{1}{c|}{動作内容} &
 \multicolumn{1}{c|}{フラグレジスタの変化}\\
 \hline\hline
 %----------------- 算術左シフト --------------
 算術左シフト &
 \tw{SLA r,adr[,x]} &
 レジスタrの内容を符号ビットを除き，\tw{adr[,x]}の番地分，各ビットを左へシフト．空いたビットには\tw{0}が入る．&
 \raisebox{-4zh}[0pt][0pt]{
 \begin{tabular}{ll}
  \tw{OF} & \tw{ :}最後に送り出されたビットの値 \\
  \tw{SF} & \tw{1:}負の時(第15ビットが\tw{1})\\
          & \tw{0:}正の時(第15ビットが\tw{0})\\
  \tw{ZF} & \tw{1:}ゼロの時(全てのビットが\tw{0})\\
          & \tw{0:}ゼロ以外
 \end{tabular}
 } \\
 \cline{1-3}
 %---------------- 算術右シフト --------------- 
 算術右シフト &
 \tw{SRA r,adr[,x]} &
 レジスタrの内容を符号ビットを除き，\tw{adr[,x}]の番地分，各ビットを右へシ
 フト．空いたビットには符号ビットと同じ値が入る．&
 \\
 \cline{1-3}
 %---------------- 論理左シフト --------------- 
 論理左シフト &
 \tw{SLL r,adr[,x]} &
 レジスタrの内容を，\tw{adr[,x}]の番地分，各ビットを左へシ
 フト．空いたビットには\tw{0}が入る．&
 \\
 \cline{1-3}
 %---------------- 論理右シフト --------------- 
 論理右シフト &
 \tw{SRL r,adr[,x]} &
 レジスタrの内容を，\tw{adr[,x}]の番地分，各ビットを左へシ
 フト．空いたビットには\tw{0}が入る．&
 \\
 \hline
 %----------------- 正分岐 --------------
 正分岐 &
 \tw{JPL adr[,x]} &
 フラグレジスタの\tw{SF}と\tw{ZF}の両方が\tw{0}の時(比較の結果，正)，\tw{adr[,x]}のアドレスへ分岐(実行が移動)する．&
 \raisebox{0zh}[0pt][0pt]{変化無し} \\
 \cline{1-3}
 %----------------- 負分岐 --------------
 負分岐 &
 \tw{JMI adr[,x]} &
 フラグレジスタの\tw{SF}が\tw{1}の時(比較の結果，負)，\tw{adr[,x]}のアドレスへ分岐(実行が移動)する．&
 \\
 \cline{1-3}
 %----------------- 非零分岐 --------------
 非零分岐 &
 \tw{JNZ adr[,x]} &
 フラグレジスタの\tw{ZF}が\tw{0}の時(比較の結果，等しくない)，\tw{adr[,x]}のアドレスへ分岐(実行が移動)する．&
 \\
 \cline{1-3}
 %----------------- 零分岐 --------------
 零分岐 &
 \tw{JZE adr[,x]} &
 フラグレジスタの\tw{ZF}が\tw{1}の時(比較の結果，等しい)，\tw{adr[,x]}のアドレスへ分岐(実行が移動)する．&
 \\
 \cline{1-3}
 %----------------- オーバーフロー分岐 --------------
 オーバーフロー分岐 &
 \tw{JOV adr[,x]} &
 フラグレジスタの\tw{OF}が\tw{1}の時(オーバーフロー)，\tw{adr[,x]}のアドレスへ分岐(実行が移動)する．&
 \\
 \cline{1-3}
 %----------------- 無条件分岐 --------------
 無条件分岐 &
 \tw{JUMP adr[,x]} &
 無条件に，\tw{adr[,x]}のアドレスへ分岐(実行が移動)する．&
 \\
 \hline
 %----------------- プッシュ --------------
 プッシュ &
 \tw{PUSH adr[,x]} &
 スタック領域に，\tw{adr[,x]}のアドレスを格納する．&
 \raisebox{0zh}[0pt][0pt]{変化無し} \\
 \cline{1-3}
 %---------------- ポップ --------------- 
 ポップ &
 \tw{POP r} &
 スタック領域からデータを取りだし，レジスタ\tw{r}に格納 &
 \\
 \hline
 %----------------- コール --------------
 コール &
 \tw{CALL adr[,x]} &
 サブルーチンを呼び出す．\tw{adr[,x]}に実行が移る．&
 \raisebox{0zh}[0pt][0pt]{変化無し} \\
 \cline{1-3}
 %---------------- リターン --------------- 
 リターン &
 \tw{RET} &
 サブルーチンから呼び出し元のルーチンへ実行が移る． &
 \\
 \hline
 %----------------- スーパーバイザーコール --------------
 スーパーバイザーコール &
 \tw{SVC adr[,x]} &
 OSの機能を呼び出す．マクロ命令の\tw{IN}や\tw{OUT}で使われている．&
 不定．OSに依存する． \\
 \hline
 %----------------- ノーオペレーション --------------
 ノーオペレーション &
 \tw{NOP} &
 なにも実行されない命令．&
 変化しない． \\
 \hline
 %
\end{tabular}
}
%
\newpage
%---------------------------------------------------------------------
\subsection{マクロ命令}
%---------------------------------------------------------------------
\footnotesize{
\begin{tabular}{|p{25mm}|p{35mm}|p{50mm}|p{40mm}|}
 \hline
 %----------------- 表項目 --------------
 \multicolumn{1}{|c|}{機能} &
 \multicolumn{1}{c|}{書式} &
 \multicolumn{1}{c|}{動作内容} &
 \multicolumn{1}{c|}{フラグレジスタの変化}\\
 \hline\hline
 %----------------- 入力 --------------
 入力命令 &
 \tw{IN ラベル1,ラベル2} &
 入力領域(ラベル1)に入力装置から文字データを入れる．入力文字長は，ラベル2に入る． &
 不定．OSに依存 \\
 \hline
 %----------------- 出力 --------------
 出力命令 &
 \tw{OUT ラベル1,ラベル2} &
 出力領域(ラベル1)の文字データ，ラベル2が示す数だけを出力装置に送る． &
 不定．OSに依存 \\
 \hline
 %----------------- レジスターの待避 --------------
 レジスターの待避 &
 \tw{RPUSH} &
 汎用レジスター内容を，\tw{GR1}$\rightarrow$\tw{GR7}の順序でスタック領域に格納． &
 不定．OSに依存 \\
 \hline
 %----------------- レジスターの復元 --------------
 レジスターの復元 &
 \tw{RPOP} &
 スタック領域の内容を，\tw{GR7}$\rightarrow$\tw{GR1}の順序で汎用レジスタに格納． &
 不定．OSに依存 \\
 \hline
\end{tabular}
}
 %
%=====================================================================
\end{document}
