%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
%    シフト命令
%      last updated 2006.1.26
%        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月27日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{前回の復習と本日の学習}
%=====================================================================
%---------------------------------------------------------------------
\subsection{復習}
%---------------------------------------------------------------------
今まで，学習したCOMET IIの命令は，次の通りである．これを思い出して，本日の学習内
容と絡めて，理解を深める必要がある．
%
\begin{itemize}
 \item アセンブラ命令
       \begin{itemize}
	\item[]
	\begin{quote}
	 \begin{tabular}{p{20mm}p{15mm}p{90mm}}
	  開始    & \tw{START} & プログラムの先頭を示し，入口名と実行開始番地を定義\\
	  終了    & \tw{END}   & プログラムの終わりを明示\\
	  領域確保 & \tw{DS} & プログラムで使うメインメモリーを予約\\
	  定義    & \tw{DC} & メインメモリーの初期値設定 \\
	 \end{tabular}
	\end{quote}	
       \end{itemize}
 \item　機械語命令
       \begin{itemize}
	\item データ転送命令
	\begin{quote}
	 \begin{tabular}{p{20mm}p{15mm}p{90mm}}
	  データ転送 & \tw{LD} & メインメモリーやレジスターの内容を汎用レジスタに転送
	  \\
	  データ転送 & \tw{ST} & 汎用レジスタのデータをメインメモリーへ転送 \\
	  アドレス転送 & \tw{LAD} & 実効アドレスを汎用レジスターへ転送 \\
	 \end{tabular}
	\end{quote}
	\item 算術，論理演算
	\begin{quote}
	 \begin{tabular}{p{20mm}p{15mm}p{90mm}}
	  算術加算 & \tw{ADDA} & 1語のデータを符号付き整数と見なし，加算を行う．
	  \\
	  論理加算 & \tw{ADDL} & 1語のデータを符号無し整数と見なし，加算を行う．\\
	  算術減算 & \tw{SUBA} & 1語のデータを符号付き整数と見なし，減算を行う．
	  \\
	  算術減算 & \tw{SUBL} & 1語のデータを符号無し整数と見なし，減算を行う．
	  \\
	  論理積 & \tw{AND} & 1語のデータのビット毎の論理積の演算を行う．\\
	  論理和 & \tw{OR} & 1語のデータのビット毎の論理和の演算を行う．\\
	  排他的論理和 & \tw{XOR} & 1語のデータのビット毎の排他的論理和の演算を行う．\\
	 \end{tabular}
	\end{quote}
       \end{itemize}
\end{itemize}
%---------------------------------------------------------------------
\subsection{本日の学習内容}
%---------------------------------------------------------------------
%--------------------------
\subsubsection{シフト命令}
%--------------------------
これは，乗算や除算を行うときに使う．CASL IIのシフト命令は，次の通りである．
%
\begin{itemize}
 \item{レジスタの内容をシフトさせることにより，$2^n$倍したり，$2^{-n}$倍する．レ
      ジスターの内容は，符号付き整数として取り扱われる
      \begin{quote}
       \begin{tabular}{p{25mm}p{15mm}p{80mm}}
	%
	\textbf{算術左シフト} & \tw{SLA} &
	レジスタの内容を符号ビットを除き左にシフト．空きには0が入る．\\
	%
	\textbf{算術右シフト} & \tw{SRA} &
	レジスタの内容を符号ビットを除き左にシフト．空きには符号ビットが入る\\
	%
       \end{tabular}
      \end{quote}
      }
 \item{レジスタの内容をシフトさせることにより，$2^n$倍したり，$2^{-n}$倍する．レ
      ジスターの内容は，符号なし整数として取り扱われる
      \begin{quote}
       \begin{tabular}{p{25mm}p{15mm}p{80mm}}
	%
	\textbf{論理左シフト} & \tw{SLL} &
	1語全てを，左にシフト．空きには0が入る\\
	%
	\textbf{論理右シフト} & \tw{SRL} &
	1語全てを，右にシフト．空きには0が入る\\
	%
       \end{tabular}
      \end{quote}
      }
\end{itemize}
%-------------------------------
\subsubsection{比較とジャンプ命令}
%-------------------------------
比較とジャンプ命令は，セットで使われることが多く，数の比較を行い，その結果を受けて，処理の実行を変える．FORTRANやC言語では，
\begin{quote}
 \tw{IF(A.GT.B)GO TO 200} \hspace{5zw} \tw{if(a>b)goto next\_step;}
\end{quote}
と書かれる構文とにている．A.GT.Bが比較命令で，IFとGO TOがジャンプ命令に相当する．

CASL IIの比較とジャンプの命令は，次の通りである．
%
\begin{itemize}
 \item{整数の大小の比較命令を学習する．比較の結果は，フラグレジスタ\tw{(FR)}を設定す
      ることで示される．
      \begin{quote}
       \begin{tabular}{p{25mm}p{15mm}p{80mm}}
	\textbf{算術比較} & \tw{CPA} &
	データは符号付き整数と見なし，比較を行う．\\
	\textbf{論理比較} & \tw{CPL} &
	データは符号無し整数と見なし，比較を行う．\\
       \end{tabular}
      \end{quote}
      }
 \item{フラグレジスタ\tw{(FR)}の値に基づいて，処理を分岐させる．
      \begin{quote}
       \begin{tabular}{p{25mm}p{15mm}p{80mm}}
	\textbf{正分岐} & \tw{JPL} &
	\tw{SF}と\tw{ZF}がともに0の時，指定の実効アドレスに分岐\\
	%
	\textbf{負分岐} & \tw{JMI} &
	\tw{SF}が１の時，指定の実効アドレスに分岐\\
	%
	\textbf{非零分岐} & \tw{JNZ} &
	\tw{ZF}が0の時，指定の実効アドレスに分岐\\
	%
	\textbf{零分岐} & \tw{JZE} &
	\tw{ZF}が1の時，指定の実効アドレスに分岐\\
	%
	\textbf{オーバーフロー分岐} & \tw{JOV} &
	\tw{OF}が1の時，指定の実効アドレスに分岐\\
	%
	\textbf{無条件分岐} & \tw{JUMP} &
	無条件に，指定の実効アドレスに分岐\\	
       \end{tabular}
      \end{quote}
      }
\end{itemize}
%
%=====================================================================
\section{シフト命令}
%=====================================================================
%---------------------------------------------------------------------
\subsection{シフト(基数Nの場合)}
%---------------------------------------------------------------------
10進数を10倍，100倍，1000倍，$\cdots$するのは簡単である．$10^{n}$倍するためには，
左にゼロを$n$個付ければ良い．これは，左シフトである．同様に$1/10$倍，$1/100$倍，
$1/1000$倍，$\cdots$するのは簡単である．$10^{-n}$倍するためには，小数点の位置を
$n$個左に寄せれば良い．これは右シフトである．

16進数の場合も同じである．たとえば，$(EF35)$を$(16)_{10}=(10)_{16}$倍や$(16^2)_{10}=(10^2)_{16}$倍，$(16^{-1})_{10}=(10^{-1})_{16}$倍や$(16^{-2})_{10}=(10^{-2})_{16}$倍すると
%
\begin{equation}
 \begin{aligned}
  (EF35)_{16}\times(16^2)_{10}&=(EF35)_{16}\times(100)_{16}\\
  &=(EF3500)_{16}\\
  %
  (EF35)_{16}\times(16)_{10}&=(EF35)_{16}\times(10)_{16}\\
  &=(EF350)_{16}\\
  %
  (EF35)_{16}\times(16^{-1})_{10}&=(EF35)_{16}\times(0.1)_{16}\\
  &=(EF3.5)_{16}\\
  %
  (EF35)_{16}\times(16^{-2})_{10}&=(EF35)_{16}\times(0.01)_{16}\\
  &=(EF.35)_{16}\\
 \end{aligned}
\end{equation}
%
となる．やはり，右や左にシフトさせれば良い．

2進数の場合も全く同じである．この場合，$2^{n}$の計算が簡単である．$n$が正の整数
の場合，左に$n$ビットシフトさせる．一方，$n$が負の整数の場合，$n$の絶対値分，右
にシフトさせる．
%
\begin{equation}
 \begin{aligned}
  (110011)_{2}\times(2^2)_{10}&=(110011)_{2}\times(100)_{2}\\
  &=(11001100)_{2}\\
  %
  (110011)_{2}\times(2)_{10}&=(110011)_{2}\times(10)_{2}\\
  &=(1100110)_{2}\\
  %
  (110011)_{2}\times(2^{-1})_{10}&=(110011)_{2}\times(0.1)_{2}\\
  &=(11001.1)_{2}\\
  %
  (110011)_{2}\times(2^{-2})_{10}&=(110011)_{2}\times(0.01)_{2}\\
  &=(1100.11)_{2}\\
 \end{aligned}
\end{equation}
%
%---------------------------------------------------------------------
\subsection{CASL IIの場合}
%---------------------------------------------------------------------
%-------------------------
\subsubsection{ビットシフト}
%-------------------------
CASL IIで取り扱う16ビットの整数を$2^n$倍する事を考える．もし，その16ビットが正
で有れば，それは簡単である．先に示したように，$n$ビット右や左にシフトさせれば良
い．

問題は，符号付き整数で，第15ビットが1の負の場合である．これは，実例を示した方が
分かりやすい．たとえば，$(-12)_{10}$を2倍と4倍する事を考える．2倍すると
$(-24)_{10}$で，4倍すると$(-48)_{10}$である．それぞれを，2の補数で取り扱うと，
となる．
%
\begin{align*}
 (-12)_{10}&\rightarrow(1111\; 1111\; 1111\; 0100)\\
 (-24)_{10}&\rightarrow(1111\; 1111\; 1110\; 1000)\\
 (-48)_{10}&\rightarrow(1111\; 1111\; 1101\; 0000)\\
\end{align*}
%
従って，CASL IIの符号付き16ビット整数の場合，$2^n$する場合は，左に$n$ビットシフ
トさせて，空いたビットに0を入れれば良い．

次に，1/2倍と1/4倍する事を考える．すると
%
\begin{align*}
 (-12)_{10}&\rightarrow(1111\; 1111\; 1111\; 0100)\\
 (-6)_{10}&\rightarrow(1111\; 1111\; 1111\; 1010)\\
 (-3)_{10}&\rightarrow(1111\; 1111\; 1111\; 1101)\\
\end{align*}
%
となる．この場合も右に$n$ビットシフトさせれば良いのであるが，空いたビットには1を
入れなくてはならない．
%
\begin{itembox}[l]{ポイント}
 \begin{itemize}
  \item 符号無し整数の場合
  \begin{itemize}
   \item $2^n$倍する場合，左に$n$ビットシフトさせて，空いたビットに0
	 を入れればよい．
   \item $2^{-n}$倍する場合，右に$n$ビットシフトさせて，空いたビットに0
	 を入れればよい．
  \end{itemize}
  \item 符号付き整数の場合
  \begin{itemize}
   \item $2^n$倍する場合，左に$n$ビットシフトさせて，空いたビットに0を入れればよい．
   \item $2^{-n}$倍する場合，右に$n$ビットシフトさせて，空いたビットには符号ビッ
	 トを入れればよい．
  \end{itemize}
 \end{itemize}
\end{itembox}
%
%-------------------------
\subsubsection{端数の処理}
%-------------------------
CASL IIの整数をビットシフトを用いて2で割ったりすると，端数(小数部)が生じる．この
端数は，16ビットを越えるので，無視される．ここで，商が切り上げなのか切り下げなの
か，疑問が発生する．これについても，実際の整数で考える．

$(5)_{10}$と$(-5)_{10}$を1ビット右にシフトさせて，1/2倍してみる．
%
\begin{align*}
 (5)_{10}&\rightarrow(0000\; 0000\; 0000\; 0101)\\
 &\text{1ビット右}\rightarrow(0000\; 0000\; 0000\; 0010)\rightarrow(2)_{10}\\
 (-5)_{10}&\rightarrow(1111\; 1111\; 1111\; 1011)\\
 &\text{1ビット右}\rightarrow(1111\;1111\; 1111\; 1101)\rightarrow(-3)_{10}\\
\end{align*}
%
この結果から，以下のようにまとめることができる．
%
\begin{itembox}[l]{ポイント}
 \begin{itemize}
  \item 正の整数の場合，端数は切り下げとなる．
  \item 負の整数の場合，端数は切り上げとなる．
 \end{itemize}
\end{itembox}
%
%---------------------------------------------------------------------
\subsection{算術シフト命令}
%---------------------------------------------------------------------
算術シフト命令は，左シフト(SLA)と右シフト(SRA)の2つがある．いずれも，符号付き整
数を取り扱い，前者は$2^n$倍，後者は$2^{-n}$倍する．算術シフト命令は，符号も考慮
していることが重要である．
%--------------------------------------
\subsubsection{算術左シフト(\tw{SLA})}
%-------------------------------------
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{SLA} \\
  \textbf{語源}   & \textbf{S}hift \textbf{L}eft \textbf{A}rithmetic\hspace{5mm}
  (shift:移す\hspace{3mm}left:左\hspace{3mm}arithmetic:算術)\\
  %
  \textbf{役割}     & レジスタの内容をnビット左に移動させる．空いたビットには，0
  が入る． これは，符号付き整数を$2^n$倍しているのと同じ．\\
  \textbf{書式}     & 教科書(p.59)の通り．第一オペランドは汎用レジスター．第二オ
  ペランドはアドレス． \\
  \textbf{機能}     & 教科書(p.59)の通り \\
  \textbf{フラグレジスタ} & 教科書(p.59)の通り．
  %
 \end{tabular}
\end{quote}
%

この命令は，符号付き整数を$2^{n}$倍する．従って，シフトにより空いたビットには，0
が入る．
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      SLA   GR0,2        ;GR0の内容を2ビット左へシフト
      SLA   GR0,0,GR1    ;GR0の内容をGR1の値，左へシフト
 \end{verbatim}
\end{quote}
%
%
%-------------------------------------------
\subsubsection{算術右シフト(\tw{SRA})}
%-------------------------------------------
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{SRA} \\
  \textbf{語源}   & \textbf{S}hift \textbf{R}ight
  \textbf{A}rithmetic\hspace{5mm}
  (shift:移す\hspace{3mm}right:右\hspace{3mm}arithmetic:算術)\\
  %
  \textbf{役割}     & レジスタの内容をnビット右に移動させる． 空いたビットには，
  符号ビットが入る．これは，符号付き整数を$2^{-n}$倍しているのと同じ．\\
  \textbf{書式}     & 教科書(p.62)の通り．第一オペランドは汎用レジスター．第二オ
  ペランドはアドレス． \\
  \textbf{機能}     & 教科書(p.62)の通り \\
  \textbf{フラグレジスタ} & 教科書(p.62)の通り．
  %
 \end{tabular}
\end{quote}
%

この命令は，符号付き整数を$2^{-n}$倍する．従って，シフトにより空いたビットには，
符号ビットが入る．
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      SRA   GR0,2        ;GR0の内容を2ビット右へシフト
      SRA   GR0,0,GR1    ;GR0の内容をGR1の値，右へシフト
 \end{verbatim}
\end{quote}
%
%
%---------------------------------------------------------------------
\subsection{論理シフト命令}
%---------------------------------------------------------------------
論理シフト命令は，左シフト(SLL)と右シフト(SRL)の2つがある．いずれも，符号無し整
数を取り扱い，前者は$2^n$倍，後者は$2^{-n}$倍する．論理シフト命令は，符号は考慮
していない．
%--------------------------------------
\subsubsection{論理左シフト(\tw{SLL})}
%-------------------------------------
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{SLL} \\
  \textbf{語源}   & \textbf{S}hift \textbf{L}eft \textbf{L}ogical\hspace{5mm}
  (shift:移す\hspace{3mm}left:左\hspace{3mm}logical:論理上の)\\
  %
  \textbf{役割}     & レジスタの内容をnビット左に移動させる．空いたビットには，
  0が入る．これは，符号無し整数を$2^n$倍しているのと同じ．\\
  \textbf{書式}     & 教科書(p.65)の通り．第一オペランドは汎用レジスター．第二オ
  ペランドはアドレス． \\
  \textbf{機能}     & 教科書(p.65)の通り \\
  \textbf{フラグレジスタ} & 教科書(p.65)の通り．
  %
 \end{tabular}
\end{quote}
%

この命令は，符号無し整数を$2^{n}$倍する．従って，シフトにより空いたビットには，0
が入る．
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      SLL   GR0,2        ;GR0の内容を2ビット左へシフト
      SLL   GR0,0,GR1    ;GR0の内容をGR1の値，左へシフト
 \end{verbatim}
\end{quote}
%
%
%-------------------------------------
\subsubsection{論理右シフト(\tw{SRL})}
%-------------------------------------
%--------------------
\paragraph{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{SRL} \\
  \textbf{語源}   & \textbf{S}hift \textbf{R}ight
  \textbf{L}ogical\hspace{5mm}
  (shift:移す\hspace{3mm}right:右\hspace{3mm}logical:論理上の)\\
  %
  \textbf{役割}     & レジスタの内容をnビット右に移動させる．空いたビットには，
  0が入る．これは，符号付き整数を$2^{-n}$倍しているのと同じ．\\
  \textbf{書式}     & 教科書(p.67)の通り．第一オペランドは汎用レジスター．第二オ
  ペランドはアドレス． \\
  \textbf{機能}     & 教科書(p.67)の通り \\
  \textbf{フラグレジスタ} & 教科書(p.67-68)の通り．
  %
 \end{tabular}
\end{quote}
%

この命令は，符号無し整数を$2^{-n}$倍する．従って，シフトにより空いたビットには，
符号ビットが入る．
%
%--------------------
\paragraph{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      SRL   GR0,2        ;GR0の内容を2ビット右へシフト
      SRL   GR0,0,GR1    ;GR0の内容をGR1の値，右へシフト
 \end{verbatim}
\end{quote}
%
%=====================================================================
\section{比較命令}
%=====================================================================
%---------------------------------------------------------------------
\subsection{算術比較(\tw{CPA})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{CPA} \\
  \textbf{語源}   & \textbf{C}om\textbf{P}are \textbf{A}rithmetic\hspace{5mm}
  (compare:比較する\hspace{3mm}arithmetic:算術)\\
  %
  \textbf{役割}     & 符号付き整数の比較を行う命令 \\
  \textbf{書式}     & 教科書(p.56)の通り \\
  \textbf{機能}     & 教科書(p.56)の通り \\
  \textbf{フラグレジスタ} & 教科書(p.56)の通り．
  %
 \end{tabular}
\end{quote}
%

この命令は，符号付き整数の差の演算結果の状態がフラグレジスターに設定すると考えれば良い．
たとえば，\tw{CPA GR1,GR2}の場合，\tw{GR1-GR2}の演算結果の正負，あるいはゼロか否
か，オーバーフローが有るか無いかがフラグレジスタに設定される．ただし，オペランド
である\tw{GR1}や\tw{GR2}の値は変わらない．
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      CPA   GR0,GR1      ;GR0-GR0 の状態をフラグレジスターに設定
      CPA   GR0,A        ;GR0-(アドレスAの内容) の状態をフラグレジスターに設定
      CPA   GR0,A,GR1    ;GR0-(アドレス[A+GR1]の内容) の状態をフラグレジスターに設定
      CPA   GR0,=5       ;GR0-5 の状態をフラグレジスターに設定
 \end{verbatim}
\end{quote}
%

教科書の例題を実行したときのメモリーとレジスターの内容を表
\ref{tab:text_list_4_11}示す．1, 5, 6, 7行はアセンブラ命
令なので実行されない．そのため，メモリーやレジスタの値は空白としている．
%
\setcounter{linenum}{1}
\begin{table}[h]
 \begin{center}
  \caption{教科書List4-11(p.56)の実行例．}
  \label{tab:text_list_4_11}
  {\small
  \begin{tabular}
   {|p{4mm}|p{5mm}p{9mm}p{15mm}||
   p{9mm}|p{4mm}p{4mm}p{4mm}|p{9mm}p{9mm}|}\hline
   %
   行            &
   \multicolumn{3}{|c||}{プログラム} &
   \tw{GR1}     &
   \tw{OF}      & \tw{SF}      & \tw{ZF}      &
   \tw{AA}      & \tw{BB}      \\ \hline
   %
   \wrtlinenum  &
   \tw{PGM}     & \tw{START}   &              &
                &
                &              &              &
                &              \\
   %
   \wrtlinenum  &
                & \tw{LD}      & \tw{GR1,AA}  &
   2            &   
   0            & 0            & 0            & 
   2            & -1            \\
   %
   \wrtlinenum  &
                & \tw{CPA}    & \tw{GR1,BB}  &
   2            &   
   0            & 0            & 0            & 
   2            & -1            \\
   %
   \wrtlinenum  &
                & \tw{RET}     &              &
   2            &   
   0            & 0            & 0            & 
   2            & -1            \\
   %
   \wrtlinenum  &
   \tw{AA}      & \tw{DC}      & \tw{2}  &
                &   
                &              &              & 
                &              \\
   %
   \wrtlinenum  &
   \tw{BB}      & \tw{DC}      & \tw{-1}  &
                &   
                &              &              & 
                &              \\
   %
   \wrtlinenum  &
                & \tw{END}     &              &
                &   
                &              &              & 
                &              \\ \hline
   %
  \end{tabular}
  }  %\smallの終わり
  \end{center}
\end{table}
%

教科書のList4-11はつまらない例題で，\tw{CPA}コマンドも動作も分からないし，説明も
おかしい．次のようなサンプルの方が良い．
%
\setcounter{linenum}{1}
\begin{table}[h]
 \begin{center}
  \caption{\tw{CPA}の実行例．}
  \label{tab:text_list_4_11d}
  {\small
  \begin{tabular}
   {|p{4mm}|p{5mm}p{9mm}p{15mm}||
   p{9mm}|p{4mm}p{4mm}p{4mm}|p{9mm}p{9mm}|}\hline
   %
   行            &
   \multicolumn{3}{|c||}{プログラム} &
   \tw{GR1}     &
   \tw{OF}      & \tw{SF}      & \tw{ZF}      &
   \tw{AA}      & \tw{BB}      \\ \hline
   %
   \wrtlinenum  &
   \tw{PGM}     & \tw{START}   &              &
                &
                &              &              &
                &              \\
   %
   \wrtlinenum  &
                & \tw{LD}      & \tw{GR1,AA}  &
   2            &   
   0            & 1            & 0            & 
   -2           & -3           \\
   %
   \wrtlinenum  &
                & \tw{CPA}    & \tw{GR1,BB}  &
   2            &   
   0            & 0            & 0            & 
   -2           & -3           \\
   %
   \wrtlinenum  &
                & \tw{RET}     &              &
   2            &   
   0            & 0            & 0            & 
   -2           & -3           \\
   %
   \wrtlinenum  &
   \tw{AA}      & \tw{DC}      & \tw{-2}  &
                &   
                &              &              & 
                &              \\
   %
   \wrtlinenum  &
   \tw{BB}      & \tw{DC}      & \tw{-3}  &
                &   
                &              &              & 
                &              \\
   %
   \wrtlinenum  &
                & \tw{END}     &              &
                &   
                &              &              & 
                &              \\ \hline
   %
  \end{tabular}
  } 
 %
  \end{center}
\end{table}
%
%---------------------------------------------------------------------
\subsection{論理比較(\tw{CPL})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{CPL} \\
  \textbf{語源}   & \textbf{C}om\textbf{P}are \textbf{L}ogical\hspace{5mm}
  (compare:比較する\hspace{3mm}logical:論理上の)\\
  %
  \textbf{役割}     & 符号無し整数の比較を行う命令 \\
  \textbf{書式}     & 教科書(p.57)の通り \\
  \textbf{機能}     & 教科書(p.57)の通り \\
  \textbf{フラグレジスタ} & 教科書(p.57)の通り．
  %
 \end{tabular}
\end{quote}
%

この命令は，符号無し整数の差の演算結果の状態がフラグレジスターに設定すると考えれば良い．
たとえば，\tw{CPA GR1,GR2}の場合，\tw{GR1-GR2}の演算結果の正負，あるいはゼロか否
か，オーバーフローが有るか無いかがフラグレジスタに設定される．ただし，オペランド
である\tw{GR1}や\tw{GR2}の値は変わらない．
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      CPL   GR0,GR1      ;GR0-GR0 の状態をフラグレジスターに設定
      CPL   GR0,A        ;GR0-(アドレスAの内容) の状態をフラグレジスターに設定
      CPL   GR0,A,GR1    ;GR0-(アドレス[A+GR1]の内容) の状態をフラグレジスターに設定
      CPL   GR0,=5       ;GR0-5 の状態をフラグレジスターに設定
 \end{verbatim}
\end{quote}
%

教科書の例題を実行したときのメモリーとレジスターの内容を表
\ref{tab:text_list_4_12}示す．1, 5, 6, 7行はアセンブラ命令なので実行されない．そ
のため，メモリーやレジスタの値は空白としている．

このサンプルプログラムで注意することは，符号付き整数でアドレスAAの値を決めている
が，比較を行うときは符号無し整数としている．それらは，
%
 \begin{center}
  \begin{tabular}{rrrr}\hline
   \multicolumn{1}{c}{アドレス} &
   \multicolumn{1}{c}{ビットパターン} &
   \multicolumn{1}{c}{符号無整数}　&
   \multicolumn{1}{c}{符号有整数} \\ \hline\hline
   %
   \tw{AA} & \tw{0000000000000010} & \tw{(2)$_{10}$} & \tw{(2)$_{10}$} \\
   \tw{BB} & \tw{1111111111111111} & \tw{(65535)$_{10}$} & \tw{(-1)$_{10}$}\\
   \hline
   %
  \end{tabular}
 \end{center}
%
となっている．
%
\setcounter{linenum}{1}
\begin{table}[h]
 \begin{center}
  \caption{教科書List4-12(p.58)の実行例．}
  \label{tab:text_list_4_12}
  {\small
  \begin{tabular}
   {|p{4mm}|p{5mm}p{9mm}p{15mm}||
   p{9mm}|p{4mm}p{4mm}p{4mm}|p{9mm}p{9mm}|}\hline
   %
   行            &
   \multicolumn{3}{|c||}{プログラム} &
   \tw{GR1}     &
   \tw{OF}      & \tw{SF}      & \tw{ZF}      &
   \tw{AA}      & \tw{BB}      \\ \hline
   %
   \wrtlinenum  &
   \tw{PGM}     & \tw{START}   &              &
                &
                &              &              &
                &              \\
   %
   \wrtlinenum  &
                & \tw{LD}      & \tw{GR1,AA}  &
   2            &   
   0            & 0            & 0            & 
   2            & -1            \\
   %
   \wrtlinenum  &
                & \tw{CPL}    & \tw{GR1,BB}  &
   2            &   
   0            & 1            & 0            & 
   2            & -1            \\
   %
   \wrtlinenum  &
                & \tw{RET}     &              &
   2            &   
   0            & 1            & 0            & 
   2            & -1            \\
   %
   \wrtlinenum  &
   \tw{AA}      & \tw{DC}      & \tw{2}  &
                &   
                &              &              & 
                &              \\
   %
   \wrtlinenum  &
   \tw{BB}      & \tw{DC}      & \tw{-1}  &
                &   
                &              &              & 
                &              \\
   %
   \wrtlinenum  &
                & \tw{END}     &              &
                &   
                &              &              & 
                &              \\ \hline
   %
  \end{tabular}
  }  %\smallの終わり
  \end{center}
\end{table}
%
%
%=====================================================================
\section{ジャンプ命令}
%=====================================================================
%---------------------------------------------------------------------
\subsection{正分岐(\tw{JPL})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{JPL} \\
  \textbf{語源}   & \textbf{J}ump\textbf{PL}us \hspace{5mm}
  (jump:ジャンプ\hspace{3mm}plus:プラス(正))\\
  %
  \textbf{役割}     & フラグレジスタ\tw{(FR)}の\tw{SF}(Sign Flag)が0，かつ，
  \tw{ZF}(Zero Flag)が0のとき，指定の実効アドレスに制御が移る． \\
  \textbf{書式}     & 教科書(p.71)の通り \\
  \textbf{機能}     & 教科書(p.71)の通り \\
  \textbf{フラグレジスタ} & 変化せず．
  %
 \end{tabular}
\end{quote}
%

この命令は，これ以前の演算の結果の状態が，0を含まない正の場合，指定の実効アドレ
スに分岐させる．通常は，比較命令とペアで使われることが多いが，そうでない場合もあ
る．この命令を使う場合は，フラグレジスタの状態をよく考える必要がある．
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      JPL   A        ;SF=0かつZF=0の場合，アドレスaにジャンプ
      JPL   A,GR1    ;SF=0かつZF=0の場合，アドレス[A+GR1]にジャンプ
 \end{verbatim}
\end{quote}
%

教科書の例題(p.71 List4-22)のプログラムを図\ref{fig:flow_4-22}に示す．
%
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]{figure/list4-22.eps}
 \end{center}
 \caption{List4-22のプログラムとフローチャート}
 \label{fig:flow_4-22}
\end{figure}
%
%---------------------------------------------------------------------
\subsection{負分岐(\tw{JMI})}
%---------------------------------------------------------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{JMI} \\
  \textbf{語源}   & \textbf{J}ump\textbf{MI}nus \hspace{5mm}
  (jump:ジャンプ\hspace{3mm}minus:マイナス(負))\\
  %
  \textbf{役割}     & フラグレジスタ\tw{(FR)}の\tw{SF}(Sign Flag)が1のとき，指定の実効アドレスに制御が移る． \\
  \textbf{書式}     & 教科書(p.72)の通り \\
  \textbf{機能}     & 教科書(p.72)の通り \\
  \textbf{フラグレジスタ} & 変化せず．
  %
 \end{tabular}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{非零分岐(\tw{JNZ})}
%---------------------------------------------------------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{JNZ} \\
  \textbf{語源}   & \textbf{J}ump on \textbf{N}on \textbf{Z}ero \hspace{5mm}
  (jump:ジャンプ\hspace{3mm}non:非\hspace{3mm}zero:ゼロ)\\
  %
  \textbf{役割}     & フラグレジスタ\tw{(FR)}の\tw{ZF}(Zero Flag)が0のとき，指定の実効アドレスに制御が移る． \\
  \textbf{書式}     & 教科書(p.73)の通り \\
  \textbf{機能}     & 教科書(p.73)の通り \\
  \textbf{フラグレジスタ} & 変化せず．
  %
 \end{tabular}
\end{quote}
%
%
%---------------------------------------------------------------------
\subsection{零分岐(\tw{JZE})}
%---------------------------------------------------------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{JZE} \\
  \textbf{語源}   & \textbf{J}ump on \textbf{ZE}ro \hspace{5mm}
  (jump:ジャンプ\hspace{3mm}zero:ゼロ)\\
  %
  \textbf{役割}     & フラグレジスタ\tw{(FR)}の\tw{ZF}(Zero Flag)が1のとき，指定の実効アドレスに制御が移る． \\
  \textbf{書式}     & 教科書(p.73)の通り \\
  \textbf{機能}     & 教科書(p.74)の通り \\
  \textbf{フラグレジスタ} & 変化せず．
  %
 \end{tabular}
\end{quote}
%
%
%---------------------------------------------------------------------
\subsection{オーバーフロー分岐(\tw{JOV})}
%---------------------------------------------------------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{JOV} \\
  \textbf{語源}   & \textbf{J}ump on \textbf{OV}erflow \hspace{5mm}
  (jump:ジャンプ\hspace{3mm}overflow:あふれる)\\
  %
  \textbf{役割}     & フラグレジスタ\tw{(FR)}の\tw{OF}(Overflow Flag)が1のとき，指定の実効アドレスに制御が移る． \\
  \textbf{書式}     & 教科書(p.74)の通り \\
  \textbf{機能}     & 教科書(p.74)の通り \\
  \textbf{フラグレジスタ} & 変化せず．
  %
 \end{tabular}
\end{quote}
%
%
%---------------------------------------------------------------------
\subsection{無条件分岐(\tw{JUMP})}
%---------------------------------------------------------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}  & \tw{JUMP} \\
  \textbf{語源}   & unconditional \textbf{J}ump \hspace{5mm}
  (jump:ジャンプ)\\
  %
  \textbf{役割}     & フラグレジスタ\tw{(FR)}に関係なく，強制的に指定の実効アド
  レスに制御を移す． \\
  \textbf{書式}     & 教科書(p.75)の通り \\
  \textbf{機能}     & 教科書(p.75)の通り \\
  \textbf{フラグレジスタ} & 変化せず．
  %
 \end{tabular}
\end{quote}
%
%

%=====================================================================
\section{課題}
%=====================================================================
%---------------------------------------------------------------------
\subsection{課題内容}
%---------------------------------------------------------------------
課題を課すので，レポートとして提出すること．課題内容は，以下の通り．
%
\setcounter{toi_num}{1}
\begin{quote}
 \begin{itemize}
 \item[\toi]整数演算，\tw{643/32+5}を計算する．以下の問いについて答えよ．
   \begin{itemize}
   \item CASL-IIのプログラムを作成せよ．
   \item このプログラムを実行させた場合，計算結果である整数の値はいくらか?
   \end{itemize}
 \item[\toi]教科書p.75のList4-23のプログラムについて，以下の問いに答えよ．
   \begin{itemize}
   \item フローチャートを作成せよ．そして，ソースプログラムの各行とフローチャート
     の対応を示せ．
   \item 使っている汎用レジスタの値を各行が実行された後，どのようになるか示せ．
   \item 各行の実行後のフラグレジスタの値を示せ．
   \item 各行の実行後のアドレス\tw{AA}と\tw{BB}の値を示せ．
   \end{itemize}
 \end{itemize}
\end{quote}
% 
%---------------------------------------------------------------------
\subsection{レポート提出要領}
%---------------------------------------------------------------------
\begin{quote}
 \begin{tabular}{ll}
  期限 & 2月3日(金) PM 1:00 \\
  用紙 & A4 \\
  提出場所 & 山本研究室の入口のポスト \\
  表紙 & 表紙を1枚つけて，以下の項目を分かりやすく記述すること．\\
       & \qquad 授業科目名「電子計算機」\\
       & \qquad 課題名「課題　機械語命令(シフト・比較・分岐)」\\
       & \qquad 3E\quad 学籍番号\quad 氏名\\
       & \qquad 提出日\\
  内容 & 2ページ以降に問いに対する答えを分かりやすく記述すること．
 \end{tabular}
\end{quote}
%
%=====================================================================
\end{document}



