%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
%    算術加算・減算
%      last updated 2005.1.20
%        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}}
\newcounter{toi_num}
\newcommand{\toi}{\textbf{\texttt [問\arabic{toi_num}]}
   \addtocounter{toi_num}{1}}
%
\begin{document}
\title{機械語命令(算術・論理演算)}
\date{2006年1月20日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{前回の復習と本日の学習}
%=====================================================================
%---------------------------------------------------------------------
\subsection{復習}
%---------------------------------------------------------------------
%-----------------------------
\subsubsection{アセンブラ命令}
%-----------------------------
アセンブラーは，アセンブラ言語を機械語に変換するプログラムである．アセンブラ命令
は，アセンブラーにその変換方法を指示する．CASL IIには，次の4つのアセンブラ命令がある．
%
\begin{quote}
 \begin{tabular}{p{15mm}p{115mm}}
  %
  \tw{START} & プログラムの先頭に，必ず書く必要がある．プログラムの実
  行開始番地を指示する． \\
  %
  \tw{END}   & プログラムの最後に，必ず書く必要がある．プログラムの記
  述の最後を示す．プログラムの実行の終了を示すものではない．\\
  %
  \tw{DC}    & プログラムで処理すべきデータを定義する．メモリーの初期
  値を与えると解釈してもよい．\\
  %
  \tw{DS}    & プログラムの実行に必要なメモリーを確保する．\\
  %
 \end{tabular}
\end{quote}
%
プログラムは命令とデータから構成されると以前に述べたが，データ部を構成するために，
\tw{DC}と\tw{DS}の命令がある．
%
%-------------------------------------
\subsubsection{機械語命令(データ転送)}
%-------------------------------------
実際のCPUの動作を示す命令が機械語命令である．要するにこれは，CPUというハードウェ
アーができることを示している．プログラムを構成するデータと命令のうち，後者は機械
語命令から構成される．

前回の授業では，データ転送に関する3つの機械語命令を学習した．
%
\begin{quote}
 \begin{tabular}{p{15mm}p{115mm}}
  %
  \tw{LD}  & メインメモリーや他の汎用レジスターのデータ(内容)を汎用レ
  ジスターにコピーする． \\
  %
  \tw{ST}  & 汎用レジスターのデータ(内容)をメインメモリーにコピーする．\\
  %
  \tw{LAD} & メインメモリーの実効番地を汎用レジスターにコピーする．指
  標レジスターの使い方によっては，汎用レジスターの値を操作できる．\\
  %
 \end{tabular}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{本日の学習内容}
%---------------------------------------------------------------------
本日は，CASL IIの整数の演算である算術加算・減算と論理加算・減算，論理演算につい
て，説明する．教科書~\cite{text_casl}のp.45-55である．学習のゴールは，以下の命令
の動作を理解することである．
\begin{itemize}
 \item 1語を符号付き整数として取り扱い，加算と減算を行う．
      \begin{quote}
       \begin{tabular}{p{25mm}p{15mm}p{80mm}}
	\textbf{算術加算} & \tw{ADDA} 
	& 1語のデータを符号付き整数と見なし，加算を行う． \\
	\textbf{算術減算} & \tw{SUBA} & 
	1語のデータを符号付き整数と見なし，減算を行う．\\
       \end{tabular}
      \end{quote}
 \item{算術加算とは異なり，これらは1語を符号無し整数として取り扱い加算・減算を行
       う．
      \begin{quote}
       \begin{tabular}{p{25mm}p{15mm}p{80mm}}
	\textbf{論理加算} & \tw{ADDL} &
	1語のデータを符号無し整数と見なし，加算を行う．\\
	\textbf{論理減算} & \tw{SUBL} &
	1語のデータを符号無し整数と見なし，減算を行う．\\
       \end{tabular}
      \end{quote}
      }
 \item{2年生のとき学習したブール代数の演算である，論理積と論理和，排他的論理和の
      命令について説明する．これらは，1語を各ビットごとに演算を行う．
      \begin{quote}
       \begin{tabular}{p{25mm}p{15mm}p{80mm}}
	\textbf{論理積} & \tw{AND} &
	1語のデータを各ビット毎に論理積を計算する．\\
	\textbf{論理和} & \tw{OR} &
	1語のデータを各ビット毎に論理和を計算する．\\
	\textbf{排他的論理和} & \tw{XOR} &
	1語のデータを各ビット毎に排他的論理和を計算する．\\
       \end{tabular}
      \end{quote}
      }
\end{itemize}
理解のポイントは，
%
\begin{itemize}
 \item{演算するデータは16ビットで，それを符号付2進数，あるいはブール代数の真偽と
      して取り扱う．負の数は2の補数という表現が使われる．}
 \item{計算結果，フラグレジスタがどのようになるかを考える．}
\end{itemize}
%
である．
%
%=====================================================================
\section{演算とは}
%=====================================================================
%---------------------------------------------------------------------
\subsection{コンピューターでの演算}
%---------------------------------------------------------------------
コンピューターの仕事は，データの加工でる．与えられたデータを，目的のデー
タに加工する．例えば，
\begin{itemize}
 \item{整数の5と8のデータが与えられると，それを加工して和である13を表
      示する．}
 \item{CD-ROMのビット列のデータを加工して，音に変換する．}
 \item{飛行機のスロットルレバーの角度とエンジンの回転数などのデータか
      ら，燃料噴射弁の角度を与えるデータを作る．}
\end{itemize}
等である．どのような場合でも，図\ref{fig:information_processing}のようになってい
る．この入出力データのことを情報と言い，それをプログラムの命令により処理を行い，
出力データを作る．情報処理とはこのようなことを言う．
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]{figure/input_processing_output.eps}
  \caption{情報処理}
  \label{fig:information_processing}
 \end{center}
\end{figure}
%

コンピューターの内部，とくにデータの処理を行うCPUでは，入力と出力のデータはビッ
ト列である．CPUでは命令に従い，ビット列の操作を行っている．このビット列を操作す
る処理のことを演算といい，プログラムでは演算命令がそれを担う．

数学でも演算と言う言葉を使うが，その内容は非常に似ている．例えば，数学との対比で
は，
%
\begin{itemize}
 \item{$\sin \pi/2$を計算して，その結果として1を得る．この場合，入力データは
      $\pi/2$で，演算は$\sin$で，出力データは1である．}
\end{itemize}
%
のように考えられる．
%
\begin{itembox}[l]{ポイント}
 コンピューターは，入力データのビット列から出力ビット列を作る処理を行っている．
 そのビット列の変換の処理を演算と言う．
\end{itembox}
%
%---------------------------------------------------------------------
\subsection{CASL IIの演算}
%---------------------------------------------------------------------
先ほど述べたように，CASL IIでも演算命令を使ってデータのビットパターンを変化させ
る．ただし，これらの命令で変化させることができるのは，汎用レジスターに格納された
データだけである．汎用レジスターのデータが変化すると，それにつられて他のレジスター
の値も変化するが，それは二次的なものである．あくまで，演算の結果，すなわちデータ
の変化は汎用レジスターに蓄えられるのである．

CASL IIで用意されている演算は，
%
\begin{itemize}
 \item{算術・論理演算命令}
 \item{比較演算命令}
 \item{シフト演算命令}
\end{itemize}
%
である\footnote{教科書のp.208に全ての演算命令が書かれている}．たったこれだけで，
かなり広範囲のデータ処理が可能である．命令の動作については，今後，学習する．諸君は，
数学的な準備は出来ているので，これらがそんなに難しく思う必要が無い．例えば，$+$
と言う数学の記号の代わりに，\tw{ADDA}と書くことを覚えればよい．
%
%=====================================================================
\section{算術加算・減算}
%=====================================================================
算術加算と減算は，データを16ビットの符号付整数として計算する．CASL II では加算と
減算の命令が用意されているが乗除算は無い．
%
%---------------------------------------------------------------------
\subsection{算術加算(ADDA)}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{tabular}{p{30mm}p{125mm}}
 \textbf{命令語}& ADDA:\hspace{3mm}
	    \textbf{ADD} \textbf{A}rithmetic\hspace{10mm}
	    (add:加える\hspace{3mm}arithmetic:算術)\\
%
 \textbf{役割} & 符号有り整数の加算を行う命令 \\
 \textbf{書式と内容} & 
 \begin{screen}
  \begin{tabular}{lllp{10mm}l}\cline{1-3}
   %
   \textbf{\footnotesize ラベル欄}　 & 
   \textbf{\footnotesize 命令コード欄} & 
   \textbf{\footnotesize オペランド欄} \\ \cline{1-3} 
   %
   \tw{label} & \tw{ADDA} & \tw{r1,r2} & & \tw{r1}$\leftarrow$\tw{r1+r2}\\
   %
   \tw{label} & \tw{ADDA} & \tw{r,}\textit{adr}\tw{[,x]} & &
   \tw{r}$\leftarrow$\tw{r+}(\textit{adr}\tw{+[x]})の内容\\
   %
   \cline{1-3}
  \end{tabular}
 \end{screen}\\
 %
 \textbf{\tw{FR}} & 計算結果に応じて，変化する．\\
 %
    &
 \begin{tabular}{lcll}\\
  \hline
 %
  \textbf{\footnotesize Flag} &
  \textbf{\footnotesize bit} &
  \textbf{\footnotesize 計算結果} &
  \textbf{\footnotesize ビットパターン} \\
  %
  \hline \hline
  %
  {\small \tw{OF}} & {\footnotesize 1} &
  {\small 結果$\,<\,$-32768または32767$\,<\,$結果} &
  {\small 結果が16ビットを超えたとき}\\
  %
  & {\footnotesize 0}&
  {\small -32768$\,\leqq\,$結果$\leqq$32767} &
  {\small 結果が16ビット以内}\\
  %
  \hline
  %
  {\small \tw{SF}} & {\footnotesize 1} &
  {\small 結果が負の場合} &
  {\small 第15ビットが1}\\
  %
  & {\footnotesize 0} &
  {\small 結果が正の場合} &
  {\small 第15ビットが0}\\
  %
  \hline
  %
  {\small \tw{ZF}} & {\footnotesize 1} &
  {\small 結果がゼロの場合} &
  {\small 全てのビットが0}\\
  %
  & {\footnotesize 0} &
  {\small 結果がゼロ以外の場合} &
  {\small いずれかのビットが1}\\
  \hline
  %
 \end{tabular}
\end{tabular}\vspace{4mm}

2個の16ビットの値を加算する命令である．16進数でも10進数でも正しく計算できる．た
だし符号付で計算を行うので，最上位の第15ビットは符号ビットを表し，2の補数で表現
される．

%
%--------------------
\subsubsection{例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      ADDA  GR0,GR1      ;GR0←GR0+GR1
      ADDA  GR0,A        ;GR0←GR0+(アドレスAの内容)
      ADDA  GR0,A,GR1    ;GR0←GR0+(アドレス[A+GR1]の内容)
      ADDA  GR0,=5       ;GR0←GR0+5
 \end{verbatim}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{算術減算(SUBA)}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{tabular}{p{20mm}p{125mm}}
 \textbf{命令語}& SUBA:\hspace{3mm}
	    \textbf{SUB}tract \textbf{A}rithmetic\hspace{10mm}
	    (subtract:引き算\hspace{3mm}arithmetic:算術)\\
%
 \textbf{役割} & 符号有り整数の減算(引き算)を行う命令 \\
 \textbf{書式と内容} & 
 \begin{screen}
  \begin{tabular}{lllp{10mm}l}\cline{1-3}
   %
   \textbf{\footnotesize ラベル欄}　 & 
   \textbf{\footnotesize 命令コード欄} & 
   \textbf{\footnotesize オペランド欄} \\ \cline{1-3} 
   %
   \tw{label} & \tw{SUBA} & \tw{r1,r2} & & \tw{r1}$\leftarrow$\tw{r1-r2}\\
   %
   \tw{label} & \tw{SUBA} & \tw{r,}\textit{adr}\tw{[,x]} & &
   \tw{r$\leftarrow$r-}(\textit{adr}\tw{+[x]})の内容\\
   %
   \cline{1-3}
  \end{tabular}
 \end{screen}\\
 %
 \textbf{\tw{FR}} & 計算結果に応じて，変化する．\\
 %
    &
 \begin{tabular}{lcll}\\
  \hline
 %
  \textbf{\footnotesize Flag} &
  \textbf{\footnotesize bit} &
  \textbf{\footnotesize 計算結果} &
  \textbf{\footnotesize ビットパターン} \\
  %
  \hline \hline
  %
  {\small \tw{OF}} & {\footnotesize 1} &
  {\small 結果$\,<\,$-32768または32767$\,<\,$結果} &
  {\small 結果が16ビットを超えたとき}\\
  %
  & {\footnotesize 0}&
  {\small -32768$\,\leqq\,$結果$\leqq$32767} &
  {\small 結果が16ビット以内}\\
  %
  \hline
  %
  {\small \tw{SF}} & {\footnotesize 1} &
  {\small 結果が負の場合} &
  {\small 第15ビットが1}\\
  %
  & {\footnotesize 0} &
  {\small 結果が正の場合} &
  {\small 第15ビットが0}\\
  %
  \hline
  %
  {\small \tw{ZF}} & {\footnotesize 1} &
  {\small 結果がゼロの場合} &
  {\small 全てのビットが0}\\
  %
  & {\footnotesize 0} &
  {\small 結果がゼロ以外の場合} &
  {\small いづれかのビットが1}\\
  \hline
  %
 \end{tabular}
\end{tabular}\vspace{4mm}

二つのデータの引き算を行う．その他は，加算命令と同じ．
%
%--------------------
\subsubsection{例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      SUBA  GR0,GR1      ;GR0←GR0-GR1
      SUBA  GR0,A        ;GR0←GR0-(アドレスAの内容)
      SUBA  GR0,A,GR1    ;GR0←GR0-(アドレス[A+GR1]の内容)
      SUBA  GR0,=5       ;GR0←GR0-5
 \end{verbatim}
\end{quote}
%
%=====================================================================
\section{論理加算・減算}
%=====================================================================
論理加算と減算は，データを16ビットの符号なし整数として計算する．先ほど示した算術
加算(\tw{ADDA})と算術減算(\tw{SUBA})は，符号付き整数\footnote{第15ビットを符号ビッ
トと見なし，2の補数で表現される．} として取り扱う．これらの違いに注意が必要であ
る．たとえば，同じ16ビットのデータでも，10進数の整数として取り扱うとき，次によう
になる．なぜこのようになるか，忘れた者は以前のノートを見よ．
%
\begin{table}[H]
 \caption{符号付き整数と負号無し整数}
 \label{tab:singned_unsigned_int}
 \begin{center}
  \begin{tabular}{rrr}\hline
   \multicolumn{1}{c}{ビットパターン} &
   \multicolumn{1}{c}{符号無整数}　&
   \multicolumn{1}{c}{符号付き整数} \\ \hline\hline
   %
   \tw{0000000001010011} & \tw{(83)$_{10}$} & \tw{(83)$_{10}$} \\
   \tw{1000000001010011} & \tw{(32851)$_{10}$} & \tw{(-32685)$_{10}$}\\
   \hline
   %
  \end{tabular}
 \end{center}
\end{table}
%
%---------------------------------------------------------------------
\subsection{論理加算(\tw{ADDL})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}& ADDL:\hspace{3mm}
  \textbf{ADD} \textbf{L}ogical\hspace{10mm}
  (add:加える\hspace{3mm}logical:論理的な)\\
  %
  \textbf{役割}     & 符号無し整数の足し算を行う命令． \\
  \textbf{書式}     & 教科書(p.48)の通り． \\
  \textbf{機能}     & 教科書(p.48)の通り． \\
  \textbf{フラグレジスタ} & 教科書(p.49)の通り．
  %
 \end{tabular}
\end{quote}
%

符号無し整数の演算を行うということは，全て正として取り扱う．それなのに，フラグレ
ジスタの\tw{SF}が1になることに対して，疑問に思うだろう．それについては，教科書の
例題で説明する．
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      ADDL  GR0,GR1      ;GR0←GR0+GR1
      ADDL  GR0,A        ;GR0←GR0+(アドレスAの内容)
      ADDL  GR0,A,GR1    ;GR0←GR0+(アドレス[A+GR1]の内容)
      ADDL  GR0,=5       ;GR0←GR0+5
 \end{verbatim}
\end{quote}
%

教科書の例題を実行したときのメモリーとレジスターの内容を表
\ref{tab:text_list_4_6}示す．それらの値は，各行の実行の終了時点での値である．た
だし，アスタリスク($\ast$)の箇所は，未定であることを示す．物理的にそれらが存在す
るので，値は未定ではあるが，ビットパターンはある．1, 6, 7, 8, 9行はアセンブラ命
令なので実行されない．そのため，メモリーやレジスタの値は空白としている．

この例題で重要なことは，フラグレジスタの\tw{SF}の値である．ここでの計算は，
%
\begin{equation*}
 \begin{aligned}
 (7FFF)_{16}0(1)_{10}
  &=(0111111111111111)_2+(0000000000000001)_2 \\
  &=(1000000000000000)_2 \\
  &=(8000)_{16}
 \end{aligned}
\end{equation*}
%
を行っている．計算結果が正であっても，第15ビットが1なので，Sign flag(\tw{SF})が1と
なる．

もし，3行目の\tw{ADDL}の代わりに，\tw{ADDA}を使うと，\tw{GR1}の内容は同じ
\tw{\#8000}となるが，フラグレジスターは\tw{OV=1, SF=1, ZF=0}となる．オーバーフロー
フラグが異なる．理由は明らかであろう．

\setcounter{linenum}{1}
\begin{table}[h]
 \begin{center}
  \caption{教科書List4-6(p.49)の実行例．}
  \label{tab:text_list_4_6}
  {\small
  \begin{tabular}
   {|p{4mm}|p{5mm}p{9mm}p{15mm}||
   p{9mm}|p{4mm}p{4mm}p{4mm}|p{9mm}p{9mm}p{9mm}|}\hline
   %
   行            &
   \multicolumn{3}{|c||}{プログラム} &
   \tw{GR1}     &
   \tw{OF}      & \tw{SF}      & \tw{ZF}      &
   \tw{AA}      & \tw{BB}      & \tw{CC}      \\ \hline
   %
   \wrtlinenum  &
   \tw{PGM}     & \tw{START}   &              &
                &
                &              &              &
                &              &              \\
   %
   \wrtlinenum  &
                & \tw{LD}      & \tw{GR1,AA}  &
   \tw{\#7FFF}  &   
   0            & 0            & 0            & 
   \tw{\#7FFF}  & 1            & $\ast$       \\
   %
   \wrtlinenum  &
                & \tw{ADDL}    & \tw{GR1,BB}  &
   \tw{\#8000}  &   
   0            & 1            & 0            & 
   \tw{\#7FFF}  & 1            & $\ast$       \\
   %
   \wrtlinenum  &
                & \tw{ST}      & \tw{GR1,CC}  &
   \tw{\#8000}  &   
   0            & 1            & 0            & 
   \tw{\#7FFF}  & 1            & \tw{\#8000}  \\
   %
   \wrtlinenum  &
                & \tw{RET}     &              &
   \tw{\#8000}  &   
   0            & 1            & 0            & 
   \tw{\#7FFF}  & 1            & \tw{\#8000}  \\
   %
   \wrtlinenum  &
   \tw{AA}      & \tw{DC}      & \tw{\#7FFF}  &
                &   
                &              &              & 
                &              &              \\
   %
   \wrtlinenum  &
   \tw{BB}      & \tw{DC}      & \tw{1}  &
                &   
                &              &              & 
                &              &              \\
   %
   \wrtlinenum  &
   \tw{CC}      & \tw{DS}      & \tw{1}       &
                &   
                &              &              & 
                &              &              \\
   %
   \wrtlinenum  &
                & \tw{END}     &              &
                &   
                &              &              & 
                &              &              \\ \hline
   %
  \end{tabular}
  }  %\amallの終わり
  \end{center}
\end{table}
%
%---------------------------------------------------------------------
\subsection{論理減算(\tw{SUBL})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}& SUBL:\hspace{3mm}
  \textbf{SUBtract} \textbf{L}ogical\hspace{10mm}
  (subtract:引き算\hspace{3mm}logical:論理的な)\\
  %
  \textbf{役割}     & 符号無し整数の引き算を行う命令． \\
  \textbf{書式}     & 教科書(p.50)の通り． \\
  \textbf{機能}     & 教科書(p.50)の通り． \\
  \textbf{フラグレジスタ} & 教科書(p.49)の通り．\\
  %
 \end{tabular}
\end{quote}
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      SUBL  GR0,GR1      ;GR0←GR0-GR1
      SUBL  GR0,A        ;GR0←GR0-(アドレスAの内容)
      SUBL  GR0,A,GR1    ;GR0←GR0-(アドレス[A+GR1]の内容)
      SUBL  GR0,=5       ;GR0←GR0-5
 \end{verbatim}
\end{quote}
%

教科書の例題を実行したときのメモリーとレジスターの内容を表
\ref{tab:text_list_4_7}に示す．この例題で重要なことは，フラグレジスタの\tw{SF}の
値である．ここでの計算は，
%
\begin{equation*}
 \begin{aligned}
 (FFFF)_{16}-(1)_{10}
  &=(1111111111111111)_2-(0000000000000001)_2 \\
  &=(1111111111111110)_2 \\
  &=(FFFE)_{16}
 \end{aligned}
\end{equation*}
%
を行っている．計算結果が正であっても，第15ビットが1なので，Sign flag(\tw{SF})が1と
なる．

\setcounter{linenum}{1}
\begin{table}[H]
 \begin{center}
  \caption{教科書List4-7(p.50)の実行例．メモリーとレジスターの値は，各行の実行の
  終了時点での値である．アスタリスク($\ast$)の箇所は未定を表し，実行されない行の
  場合は空白としている．}
  \label{tab:text_list_4_7}
  {\small
  \begin{tabular}
   {|p{4mm}|p{5mm}p{9mm}p{15mm}||
   p{9mm}|p{4mm}p{4mm}p{4mm}|p{9mm}p{9mm}p{9mm}|}\hline
   %
   行            &
   \multicolumn{3}{|c||}{プログラム} &
   \tw{GR1}     &
   \tw{OF}      & \tw{SF}      & \tw{ZF}      &
   \tw{AA}      & \tw{BB}      & \tw{CC}      \\ \hline
   %
   \wrtlinenum  &
   \tw{PGM}     & \tw{START}   &              &
                &
                &              &              &
                &              &              \\
   %
   \wrtlinenum  &
                & \tw{LD}      & \tw{GR1,AA}  &
   \tw{\#FFFF}  &   
   0            & 1            & 0            & 
   \tw{\#FFFF}  & 1            & $\ast$       \\
   %
   \wrtlinenum  &
                & \tw{SUBL}    & \tw{GR1,BB}  &
   \tw{\#FFFE}  &   
   0            & 1            & 0            & 
   \tw{\#FFFF}  & 1            & $\ast$       \\
   %
   \wrtlinenum  &
                & \tw{ST}      & \tw{GR1,CC}  &
   \tw{\#FFFE}  &   
   0            & 1            & 0            & 
   \tw{\#FFFF}  & 1            & \tw{\#FFFE}  \\
   %
   \wrtlinenum  &
                & \tw{RET}     &              &
   \tw{\#FFFE}  &   
   0            & 1            & 0            & 
   \tw{\#FFFF}  & 1            & \tw{\#FFFE}  \\
   %
   \wrtlinenum  &
   \tw{AA}      & \tw{DC}      & \tw{\#FFFF}  &
                &   
                &              &              & 
                &              &              \\
   %
   \wrtlinenum  &
   \tw{BB}      & \tw{DC}      & \tw{1}  &
                &   
                &              &              & 
                &              &              \\
   %
   \wrtlinenum  &
   \tw{CC}      & \tw{DS}      & \tw{1}       &
                &   
                &              &              & 
                &              &              \\
   %
   \wrtlinenum  &
                & \tw{END}     &              &
                &   
                &              &              & 
                &              &              \\ \hline
   %
  \end{tabular}
  }  %\amallの終わり
 \end{center}
\end{table}
%
%=====================================================================
\section{論理演算命令}
%=====================================================================
CASL IIの場合，論理積と論理和，排他的論理和の論理演算命令が用意されている．COMET
IIは，1語である16ビットの各ビット毎の論理演算を行う．論理演算については，2年生の
ブール代数で学習したが，忘れた人もいると思うので，表に載せておく．
%
\begin{table}[H]
 \begin{tabular}{ccc}
  %--------- 論理積 -----------------
  \begin{minipage}[t]{0.3\hsize}
   \caption{論理積(\tw{AND})}
   \label{tabel:AND}
   \begin{center}
    \begin{tabular}{cc|c} \hline
     $A$ & $B$ & $A\cdot B$ \\ \hline\hline
     0 & 0 & 0 \\
     0 & 1 & 0 \\
     1 & 0 & 0 \\
     1 & 1 & 1 \\ \hline
    \end{tabular}
   \end{center}
  \end{minipage} &
  %--------- 論理和 -----------------
  \begin{minipage}[t]{0.3\hsize}
   \caption{論理和(\tw{OR})}
   \label{tabel:OR}
   \begin{center}
    \begin{tabular}{cc|c} \hline
     $A$ & $B$ & $A+B$ \\ \hline\hline
     0 & 0 & 0 \\
     0 & 1 & 1 \\
     1 & 0 & 1 \\
     1 & 1 & 1 \\ \hline
    \end{tabular}
   \end{center}
  \end{minipage} &
  %--------- 論理和 -----------------
  \begin{minipage}[t]{0.3\hsize}
   \caption{排他的論理和(\tw{XOR})}
   \label{tabel:XOR}
   \begin{center}
    \begin{tabular}{cc|c} \hline
     $A$ & $B$ & $A \oplus B$ \\ \hline\hline
     0 & 0 & 0 \\
     0 & 1 & 1 \\
     1 & 0 & 1 \\
     1 & 1 & 0 \\ \hline
    \end{tabular}
   \end{center}
  \end{minipage} 
%
 \end{tabular}
\end{table}
%
%
%---------------------------------------------------------------------
\subsection{論理積(\tw{AND})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}& AND:\hspace{3mm}
  \textbf{AND}\hspace{10mm}
  (and:かつ)\\
  %
  \textbf{役割}     & ビット毎の論理積を計算する． \\
  \textbf{書式}     & 教科書(p.51)の通り． \\
  \textbf{機能}     & 教科書(p.51)の通り． \\
  \textbf{フラグレジスタ} & 教科書(p.51)の通り．\\
  %
 \end{tabular}
\end{quote}
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      AND  GR0,GR1      ;GR0←(GR0の各ビット).AND.(GR1の各ビット)
      AND  GR0,A        ;GR0←(GR0の各ビット).AND.(アドレスAの内容の各ビット)
      AND  GR0,A,GR1    ;GR0←GR0.AND.(アドレス[A+GR1]の内容)
      AND  GR0,=5       ;GR0←GR0.AND.(0000000000000101)
 \end{verbatim}
\end{quote}
%

\tw{AND}命令の使われ方として多いのは，マスク処理への応用である．たとえ
ば，\tw{GR0}の最下位のビットが0か1かを調べる場合である．この場合，
\tw{AA}の内容を，\tw{\#0001}として，
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	AND  GR0,AA    ;AA=#0001
 \end{verbatim}
\end{quote}
%
を実行する．すると，もしGR1の最下位ビット(第0ビット)が0の場合，フラグレジスタの
\tw{ZF=1}になる．このような使われ方は非常に多い．この処理には，第0ビット以外は関
係ないので，隠している．このことをマスクと言う．このようにして特定のビットを調べ
ることができる．次に述べる\tw{OR}の命令でも，これと似た処理ができそうに思えるが，
大変面倒である．なぜか考えてみよ．

この応用として，特定のビットを0にすることができる．たとえば，\tw{A}の内容を
\tw{\#5555}として，
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	AND  GR0,A    ;#5555
 \end{verbatim}
\end{quote}
%
を実行する．すると，GR1の奇数番目のビットが0に設定される．
%
%
%---------------------------------------------------------------------
\subsection{論理和(\tw{OR})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}& OR:\hspace{3mm}
  \textbf{OR}\hspace{10mm}
  (or:または)\\
  %
  \textbf{役割}     & ビット毎の論理和を計算する． \\
  \textbf{書式}     & 教科書(p.53)の通り． \\
  \textbf{機能}     & 教科書(p.53)の通り． \\
  \textbf{フラグレジスタ} & 教科書(p.51)の通り．\\
  %
 \end{tabular}
\end{quote}
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      OR   GR0,GR1      ;GR0←(GR0の各ビット).OR.(GR1の各ビット)
      OR   GR0,A        ;GR0←(GR0の各ビット).OR.(アドレスAの内容の各ビット)
      OR   GR0,A,GR1    ;GR0←GR0.OR.(アドレス[A+GR1]の内容)
      OR   GR0,=5       ;GR0←GR0.OR.(0000000000000101)
 \end{verbatim}
\end{quote}
%

\tw{AND}とは反対に，\tw{OR}命令は，特定のビットを1にすることができる．
たとえば，\tw{AA}の内容を\tw{\#5555}として，
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	OR   GR0,AA   ;AA=#5555
 \end{verbatim}
\end{quote}
%
を実行する．すると，GR1の偶数番目のビットが1に設定される．
%
%
%
%---------------------------------------------------------------------
\subsection{排他的論理和(\tw{XOR})}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{quote}
 \begin{tabular}{p{30mm}p{100mm}}
  \textbf{命令語}& XOR:\hspace{3mm}
  e\textbf{X}clusive \textbf{OR}\hspace{10mm}
  (exclusive:排他的な \hspace{3mm} or:または)\\
  %
  \textbf{役割}     & ビット毎の排他的論理和を計算する． \\
  \textbf{書式}     & 教科書(p.54)の通り． \\
  \textbf{機能}     & 教科書(p.54)の通り． \\
  \textbf{フラグレジスタ} & 教科書(p.51)の通り．\\
  %
 \end{tabular}
\end{quote}
%
%--------------------
\subsubsection{使用例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      XOR  GR0,GR1      ;GR0←(GR0の各ビット).XOR.(GR1の各ビット)
      XOR  GR0,A        ;GR0←(GR0の各ビット).XOR.(アドレスAの内容の各ビット)
      XOR  GR0,A,GR1    ;GR0←GR0.XOR.(アドレス[A+GR1]の内容)
      XOR  GR0,=5       ;GR0←GR0.XOR.(0000000000000101)
 \end{verbatim}
\end{quote}
%

\tw{XOR}命令は，ビットを反転することができる．すなわち，論理否定(NOT)
の動作をすることができる．これは，\tw{AA}の内容を\tw{\#FFFF}として，
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	XOR  GR0,AA   ;AA=#FFFF
 \end{verbatim}
\end{quote}
%
を実行する．すると，GR1のすべてのビットが反転される．

特定のビットを反転することも可能である．たとえば，\tw{AA}の内容を
\tw{\#5555}として，
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	XOR  GR0,AA   ;AA=#5555
 \end{verbatim}
\end{quote}
%
を実行する．すると，GR1の偶数番目のビットが反転される．
%
%=====================================================================
\section{レポート}
%=====================================================================
%---------------------------------------------------------------------
\subsection{課題}
%---------------------------------------------------------------------
\setcounter{toi_num}{1}
\begin{quote}
 \begin{itemize}
%
  \item[\toi]次の論理加算を行うプログラムを作成し，プログラムの各実効段階のフラグレジス
	     タの値を示せ．\\
  \begin{tabular}{p{45mm}p{45mm}p{45mm}}
	      (ア) \bf{10+123} &
	      (イ) \bf{\#0FFF+\#0001} &
	      (ウ) \bf{\#8001+32767}
 \end{tabular}
%
  \item[\toi]次の論理減算を行うプログラムを作成し，プログラムの各実効段階のフラグレジス
	     タの値を示せ．\\
  \begin{tabular}{p{45mm}p{45mm}p{45mm}}
	      (ア) \bf{10-123} &
	      (イ) \bf{\#7FFF-\#8FFE} &
	      (ウ) \bf{\#8001-32767}
 \end{tabular}
%
  \item[\toi]次の論理加算のプログラムの各実効段階でのメモリーとフラグレジスタの値を示せ．
	     \setcounter{linenum}{1}
 \begin{table}[H]
  \begin{center}
   {\small
   \begin{tabular}
    {|p{4mm}|p{5mm}p{9mm}p{15mm}||
    p{9mm}|p{4mm}p{4mm}p{4mm}|p{9mm}p{9mm}p{9mm}|}\hline
    %
    行            &
    \multicolumn{3}{|c||}{プログラム} &
    \tw{GR1}     &
    \tw{OF}      & \tw{SF}      & \tw{ZF}      &
    \tw{AA}      & \tw{BB}      & \tw{CC}      \\ \hline
    %
    \wrtlinenum  &
    \tw{PGM}     & \tw{START}   &              &
    &
    &              &              &
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{LD}      & \tw{GR1,AA}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{ADDL}    & \tw{GR1,BB}  &
                &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{ST}      & \tw{GR1,CC}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{RET}     &              &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    \tw{AA}      & \tw{DC}      & \tw{\#FFF1}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    \tw{BB}      & \tw{DC}      & \tw{\#000F}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    \tw{CC}      & \tw{DS}      & \tw{1}       &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{END}     &              &
    &   
    &              &              & 
    &              &              \\ \hline
    %
   \end{tabular}
   }  %\smallの終わり
  \end{center}
 \end{table}
%
  \item[\toi]次の論理減算のプログラムの各実効段階でのメモリーとフラグレジスタの値を示せ．
	     \setcounter{linenum}{1}
	     \begin{table}[H]
  \begin{center}
   {\small
   \begin{tabular}
    {|p{4mm}|p{5mm}p{9mm}p{15mm}||
    p{9mm}|p{4mm}p{4mm}p{4mm}|p{9mm}p{9mm}p{9mm}|}\hline
    %
    行            &
    \multicolumn{3}{|c||}{プログラム} &
    \tw{GR1}     &
    \tw{OF}      & \tw{SF}      & \tw{ZF}      &
    \tw{AA}      & \tw{BB}      & \tw{CC}      \\ \hline
    %
    \wrtlinenum  &
    \tw{PGM}     & \tw{START}   &              &
    &
    &              &              &
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{LD}      & \tw{GR1,AA}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{SUBL}    & \tw{GR1,BB}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{ST}      & \tw{GR1,CC}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{RET}     &              &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    \tw{AA}      & \tw{DC}      & \tw{\#8000}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    \tw{BB}      & \tw{DC}      & \tw{\#8001}  &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    \tw{CC}      & \tw{DS}      & \tw{1}       &
    &   
    &              &              & 
    &              &              \\
    %
    \wrtlinenum  &
    & \tw{END}     &              &
    &   
    &              &              & 
    &              &              \\ \hline
    %
   \end{tabular}
   }  %\smallの終わり
  \end{center}
	     \end{table}
	     %
  \item[\toi] 次のプログラムの動作をするプログラムを作成せよ．
	     \begin{itemize}
	      \item{\tw{\#ABCD}の奇数番目のビットを0に設定する．}
	      \item{結果を，メモリーに格納する．}
	     \end{itemize}
%
  \item[\toi] 次のプログラムの動作をするプログラムを作成せよ．
	     \begin{itemize}
	      \item{\tw{\#ABCD}の第0,1,2,3と第8,9,10,11番目のビットを1に設定する．}
	      \item{結果を，メモリーに格納する．}
	     \end{itemize}
%
 \end{itemize}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{レポート提出要領}
%---------------------------------------------------------------------
提出方法は，次の通りとする．
% 
\begin{quote}
 \begin{tabular}{ll}
  期限 & 1月27日(金) PM 1:00 \\
  用紙 & A4 \\
  提出場所 & 山本研究室の入口のポスト \\
  表紙 & 表紙を1枚つけて，以下の項目を分かりやすく記述すること．\\
       & \qquad 授業科目名「電子計算機」\\
       & \qquad 課題名「課題　算術・論理演算」\\
       & \qquad 3E\quad 学籍番号\quad 氏名\\
       & \qquad 提出日\\
  内容 & 2ページ以降に問いに対する答えを分かりやすく記述すること．
 \end{tabular}
\end{quote}
%
%
\newpage
%=====================================================================
\section{付録}
%=====================================================================
%=====================================================================
\subsection{乗除算はどうするの?}
%=====================================================================
ここで，賢明な諸君は，4則演算の残りの2つ，乗除算はどうしたのという疑問が湧くはず
である．湧いて欲しい．

最近のCPUは，これら乗除算のハードウェアーが実装されており，それに対応する機械語
命令がある．しかし，単純なCOMET IIには，そのハードウェアはなく，当然機械語命令も
無い．そのため，ソフトウェアーでその仕組みを実現させなくてはならない．詳細につい
ては，後で学習するが，ちょっとだけ方法を示す．興味深い方法である．
%
%---------------------------------------------------------------------
\subsubsection{乗算}
%---------------------------------------------------------------------
%---------------------------------
\paragraph{算術加算を使う方法}
%---------------------------------
例えば，$10\times3$を計算する場合，$10+10+10$のように必要な回数だけ足し合わせて
乗算を行う．このように算術加算を用いて乗算を行うことができる．ただし，この方法は
もっとも原始的で効率の悪い方法である．人間がこの計算を行うのは非現実的であるが，
単純作業を非常に高速で行うコンピューター向きの方法である．

この例でもわかるように加算ができれば，乗算はできるのである．
%-------------------------------------
\paragraph{ビットシフトを使う方法}
%-------------------------------------
もう少し効率の良い方法は，ビットシフトを使う方法である．これは，小学生のときに学
習をした筆算を用いた掛け算と同じである．たとえば，$34\times24$を計算する場合，筆
算は$34\times(2\times10^{1}+4\times10^{0})$と分解したはずである．そうして，次の
手順でこの除算を行ったはずである．
%
\begin{enumerate}
 \item{$34\times2$を計算し，1桁ずらす(10倍する)．}
 \item{$34\times4$を計算する．}
 \item{先の計算結果を合計する．この合計816が$34\times24$の計算結果である．}
\end{enumerate}
%

同じことを2進数で行う．これがコンピューターによる乗算である．先ほどと
同じ計算($32\times24$)を行う．これを2進数で表現すると，
%
\begin{align*}
 (100010)_2\times(11000)_2=(100010)_2\times(1\times2^4+1\times2^3)
\end{align*}
%
となる．これを先ほど同様の手順で計算する．
%
\begin{enumerate}
 \item{掛け算は1倍なので計算する必要が無く，最初に$(100010)_2$を4桁左
      にずらす(ビットシフト)．すると，$(1000100000)_2$となる．}
 \item{次に$(100010)_2$を3桁左にずらす．すると，$(100010000)_2$となる．}
 \item{先の計算結果を合計すると，$(1100110000)_2$となる．これは，10進
      数の816である．}
\end{enumerate}
%
ここでは，ビットシフトと加算命令を使った．これらの命令が用意されていれば乗算がで
きることがわかるであろう．実際，CASL IIにはビットシフトの命令は用意されている．
%
%---------------------------------------------------------------------
\subsubsection{除算}
%---------------------------------------------------------------------
%---------------------------------
\paragraph{算術減算を使う方法}
%---------------------------------
$10/3$の計算は10からから3を引いていきます．そして，負になったら計算は完了です．
すると，商と余りが分かります．算術減算を用いて乗除算が出来ます．この例でもわかる
ように減算ができれば，除算はできるのである．
%
この方法は効率が悪いので，もう少しましな方法を考える．小学生の時に学習した筆算の
アルゴリズムを適用すれば効率は良くなる．計算は次のようにする．計算の準備として，
10と3を2進数で表す．
%
\begin{align*}
 (10)_{10}=(1010)_{2}\qquad\qquad(3)_{10}=(11)_2
\end{align*}

次に示すように計算すれば，計算効率は上がるであろう．計算順序は，筆算での割り算と
同じである．
\begin{enumerate}
 \item{$(1)_2$から$(11)_2$を減算したいが，負になるのでそれは不可とする．}
 \item{$(10)_2$から$(11)_2$を減算したいが，これも負になるので不可とす
      る．}
 \item{$(101)_2$から$(11)_2$を減算する．それは可能で，結果は$(10)_2$で，
      その桁に$(1)_2$が立つ．}
 \item{先ほどの残りと次の桁を合わせた$(100)_2$は減算可能である．減算の
      結果は$(1)_2$で，その桁に$(1)_2$が立つ．}
 \item{これ以上桁がないので，計算は完了である．商は$(11)_2=(3)_{10}$余
      りは$(1)_2=(1)_{10}$となる．}
\end{enumerate}
%
%-------------------------------------
\paragraph{ビットシフトを使う方法}
%-------------------------------------
直ちに，ビットシフトが適用できるのは，割る数が$2^n$になっている場合である．ただ，
先ほどの筆算のアルゴリズムでもビットシフトは使ってはいる．
%
%---------------------------------------------------------------------
\subsubsection{まとめ(乗除算)}
%---------------------------------------------------------------------
ということで，加算と減算ができれば乗除算は可能である．さらに賢明な諸君は，次の疑
問が湧くはずである．湧いて欲しい．三角関数や指数関数などは，どうやって計算してい
るのか?．三角関数や指数関数は，テイラー展開(マクローリン展開)を使うと四則演算に
分解できることを学習したはずである．したがって，四則演算ができれば，それらの関数
は計算可能である．高級言語のコンパイラーは，これらの関数を4則演算に変換して計算
するようにしている．
%=====================================================================
\bibliographystyle{jplain}
\bibliography{reference}
%=====================================================================
\end{document}



