%=====================================================================
% 秋田高専 3E 電子計算機用テキスト
%    機械語命令の書きかたとデータ転送
%      last updated 2005.12.15
%        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{機械語命令の書き方とデータ転送命令}
\date{2005年12月16日}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気工学科}}
\maketitle
%
%=====================================================================
\section{ここでの学習}
%=====================================================================
アセンブラ命令の学習が終わったので，機械語命令の説明を始める．機械語命令が終われ
ば，マクロ命令である．他の2つの命令に比べて，機械語命令は数も多く，その動作も多
岐にわたる．なんと言っても，アセンブラのプログラムの中心はこの機械語命令である．
プログラムの目的であるデータの加工は，ほとんど機械語命令で実行される．

この命令は，CPUの機能を表しているので，注意深い諸君は，CPUを作るために必要な機能
の概略を理解できるであろう．実際，COMET IIと同じような命令が，世の中で使われてい
るほとんどのCPUに実装されている．市販のCPUはCOMET IIより複雑な命令にも対
応しており，プログラマーには便利になっていいる．

機械語命令は数が多いので，しばらくは機械語命令の学習を進めることになる．命令の文
法は教科書に書いてある．プリントではその補助的な説明を行うことにする．

ここでのの学習のゴールは，
\begin{itemize}
 \item{機械語命令の書き方が分かる．}
 \item{データ転送命令が理解できる．}
      \begin{description}
       \item[\tw{LD}]レジスターへのデータ転送
       \item[\tw{ST}]メモリーへのデータ転送
       \item[\tw{LAD}]レジスターへアドレス転送
      \end{description}
\end{itemize}
である．
%
%=====================================================================
\section{機械語命令の書き方}
%=====================================================================
%---------------------------------------------------------------------
\subsection{命令形式}
%---------------------------------------------------------------------
教科書に書かれているように，機械語命令の書き方は，オペランドが異なる5 種類に分類
できる．機械語命令の場合，CASL IIの1行は機械語命令の1, 2ワードのマシン語に変換さ
れて，メインメモリーに格納される．1ワードは16ビットで，2ワードは32ビットである．
その1あるいは2ワードで，命令の種類と対象であるオペランドを示すマシン語になる
\footnote{マシン語への変換は，教科書のp.213を見よ}．

機械語命令の書き方は，オペランドの指定の仕方により，以下の5通りに分類できる．
\vspace{5mm}\\
%
\hspace{10mm}
\begin{tabular}{llll}\hline
 \textbf{\footnotesize ラベル欄}　 & 
 \textbf{\footnotesize 命令コード欄} & 
 \textbf{\footnotesize オペランド欄} &
 \textbf{\footnotesize 注釈欄}\\ \hline 
 %
 \tw{[label]} & \tw{OP} & \tw{r1,r2} &
 \tw{;レジスタ同士の操作}\\
 %
 \tw{[label]} & \tw{OP} & \tw{r,}\textit{adr}\tw{[,x]} &
 \tw{;レジスタとメモリーの操作}\\
 %
 \tw{[label]} & \tw{OP} & \textit{adr}\tw{[,x]} &
 \tw{;メモリーの操作}\\
 %
 \tw{[label]} & \tw{OP} & \tw{r} &
 \tw{;レジスタの操作}\\
 %
 \tw{[label]} & \tw{OP} &  &
 \tw{;メモリーやレジスタを操作しない}\\
 \hline
\end{tabular}\\ \vspace{3mm}
%

これを見て分かるように，機械語命令の多くは，メモリーやレジスターを操作する．プロ
グラムの目的は，データを処理することで，そのデータはメモリーまたはレジスターに格
納されることからも，そのことが理解できる．
%
%---------------------------------------------------------------------
\subsection{オペランドの内容}
%---------------------------------------------------------------------
命令の対象となるオペランドの書き方は，先に示したように，5種類である．これらの内，
\tw{r1}と\tw{r2}, \tw{r}が汎用レジスタを示している．\tw{GR0}とか，\tw{GR1}と書く．
汎用レジスタの範囲は，\tw{GR0}から\tw{GR7}までである．


\tw{x}は指標レジスタを示している．指標レジスタについては，第6回の授業で説明した
が，忘れていると思うので，再度説明する．プログラムを書いているとき，基準点のアド
レスにある値を加算してデータにアクセスしなくてはならないことがある．このようなと
きに指標レジスタを使う．CASL IIでは，オペランド欄に，
%
\vspace{-3mm}
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
   adr,x	
 \end{verbatim}
\end{quote}
\vspace{-5mm}
%
と書く．\tw{adr}が基準点のアドレスで，\tw{x}が指標レジスタである．実際にデータが
操作される実行アドレスは，\tw{adr+x}ということになる．\tw{adr}は，つぎに述べる方
法でアドレスを指定する．加算する値を格納するのは指標レジスタ(index register)で汎
用レジスタの\tw{GR1}〜\tw{GR7}を使う．どうして，\tw{GR0}はダメなのか?．命令をマ
シン語に直すとこの理由が分かる．このように，指標レジスタを用いて，アドレスを操作
することをアドレス修飾と言う．
%
%---------------------------------------------------------------------
\subsection{アドレス}
%---------------------------------------------------------------------
メインメモリーの中に格納されているプログラム(命令とデータ)にアクセスしないと，
CPUは何もできない．メモリーの特定の場所の内容を参照するために，記憶領域に応じて
番地が振り分けられている．その番地のことをアドレスと言う．

COMET IIのメインメモリーのアドレスは，16ビットである．従って，アドレスの範囲は，
0〜65535(\#0000〜\#FFFF)番地となる．このメモリー空間は，20年くらい前の8ビットパ
ソコンと同じである．64kバイトです．ちなみに，いま主流の32ビットパソコンのメモリー
空間は32ビットで，4Gバイトにもなる．メモリーにアクセスする場合，番地を指定しなく
てはならない．その番地の指定方法を述べる．

教科書に書かれている通り(p.39)，アドレスは，つぎに示す3通りの方法で記述でる．最初の2つ
の10進数と16進数を使う場合，絶対アドレスを指定することになる．よっぽどのことがな
いかぎり，絶対番地を指定することはない\footnote{実際は，メモリーの番地ではないが，
数値を使うことがある．後で説明する．}．なぜならば，実際のプログラムを実行する場
合，データがどの番地に格納されているかは，プログラマは分からない．プログラム実行
段階で，OSが決めるからである．従って，みなさんは最後のアドレス定数を使うことにな
る．
\vspace{3mm}

\hspace{5mm}
\begin{tabular}{p{25mm}p{105mm}}
 10進定数     & 10進数の定数を用いる．内容は，教科書に書かれている通
 り． \\
 16進定数     & 16進数の定数を用いる．16進数であることを表すために，
 先頭に\tw{\#}を付ける．\\
 アドレス定数 & ラベル名を指定する．アセンブラーにより，ラベル名がア
 ドレスに変換される．
\end{tabular}
%
%---------------------------------------------------------------------
\subsection{リテラル}
%---------------------------------------------------------------------
機械語命令のオペランドの\textit{adr}は，アドレスを示すことは先に述べた通りである．
アドレスの指定は，10進定数と16進定数，アドレス定数がある．さらに，リテラルでもそ
れを指定できる．リテラルを用いたアドレスは，10 進定数や16進定数，あるいは文字定
数の前に'\tw{=}'の記号をつける．

教科のリテラル形式をアセンブルすると，\tw{DC}命令を使ったのマシン語になる．あと
は，教科書の通り(p.39)．

%=====================================================================
\section{データ転送命令}
%=====================================================================
メインメモリーからレジスタに，あるいはレジスタからメモリーにデータを転送する命令
の使い方を示す．いずれの場合も，1回のデータの転送量は1ワード(16ビット)である．メ
モリーやレジスタの領域は複数あるので，その位置を指定しなくてはならない．メモリー
の場合は先ほど示した方法でアドレスを指定する．レジスターの場合はその名前で転送場
所を指定する．
%
%---------------------------------------------------------------------
\subsection{レジスターへの転送(LD)}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{description}
 \item[役割]{レジスターにデータを転送する．}
\end{description}
LD:LoaD
%
\begin{screen}
 \textbf{\Large 書式}\hspace{10mm}
 \begin{tabular}{lll}\hline
  \textbf{\footnotesize ラベル欄}　 & 
  \textbf{\footnotesize 命令コード欄} & 
  \textbf{\footnotesize オペランド欄} \\ \hline 
  \tw{label} & \tw{LD} & \tw{r1,r2} \\
  \tw{label} & \tw{LD} & \tw{r,}\textit{adr}\tw{[,x]} \\ \hline
 \end{tabular}
\end{screen}
%
\begin{itemize}
\item{フラグレジスターの値は変化する．}
\end{itemize}

COMET IIでは，算術演算や論理演算は必ず汎用レジスター上で行われる\footnote{演算は
CPUが行うため，その記憶領域であるレジスターが使われるのは当たり前である．}．その
ため，演算の対象となるデータを汎用レジスターに格納しなくてはならない．\tw{LD}命
令は，メインメモリーのあるアドレスのデータを汎用レジスタにコピーする命令として使
われる．そればかりではなく，汎用レジスター間のコピーにも使われる．しかし，汎用レ
ジスターからメインメモリーや，メインメモリーからメインメモリーへのコピーはできな
い．メインメモリーへのコピーはST 命令を使う．

語源は，英語の1oadである．loadのにはいろいろ意味があるが，その中で'読み込む'
と意味で使われている．パソコンでアプリケーションを実行するとき，ハードディスク
にあるプログラムをメインメモリーへ読み込むこともロードという．ネットでのファ
イルの受け渡しのことも，ダウンロードやアップロードという．
%
%--------------------
\subsubsection{例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      LD  GR0,GR1   ;GR1の内容をGR0へコピー
      LD  GR0,A     ;ラベルAが示す番地の内容をGR0へコピー
      LD  GR0,A,GR1 ;(A+GR1)番地の内容をGR0へコピー
      LD  GR1,GR1   ;GR1の符号をチェック
 \end{verbatim}
\end{quote}
%
%
%---------------------------------------------------------------------
\subsection{メモリーへの転送(ST)}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{description}
 \item[役割]{レジスターの内容をメモリーへ転送する．}
\end{description}
ST:STore
%
\begin{screen}
 \textbf{\Large 書式}\hspace{10mm}
 \begin{tabular}{lll}\hline
  \textbf{\footnotesize ラベル欄}　 & 
  \textbf{\footnotesize 命令コード欄} & 
  \textbf{\footnotesize オペランド欄} \\ \hline 
  \tw{label} & \tw{ST} & \tw{r,}\textit{adr}\tw{[,x]} \\ \hline
 \end{tabular}
\end{screen}
%
\begin{itemize}
\item{フラグレジスターの値は変化しない．}
\end{itemize}

ST命令は，LD命令とは逆に，汎用レジスタの内容をメインメモリの指定番地にコピーする．
語源はSToreで，'備蓄する'などの意味がある．書式や機能は教科書に書かれている通り(p.42)．
%
%--------------------
\subsubsection{例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      ST  GR0,A     ;GR0の内容をメインメモリーのA番地へコピー
      ST  GR0,A,GR1 ;GR0の内容を(A+GR1)番地へコピー
 \end{verbatim}
\end{quote}
%
%
%---------------------------------------------------------------------
\subsection{アドレスの転送(LAD)}
%---------------------------------------------------------------------
%--------------------
\subsubsection{内容}
%--------------------
\begin{description}
 \item[役割]{実効アドレスを汎用レジスターにロードする．}
\end{description}
LAD:Load ADdress
%
\begin{screen}
 \textbf{\Large 書式}\hspace{10mm}
 \begin{tabular}{lll}\hline
  \textbf{\footnotesize ラベル欄}　 & 
  \textbf{\footnotesize 命令コード欄} & 
  \textbf{\footnotesize オペランド欄} \\ \hline 
  \tw{label} & \tw{LAD} & \tw{r,}\textit{adr}\tw{[,x]} \\ \hline
 \end{tabular}
\end{screen}
%
\begin{itemize}
\item{フラグレジスターの値は変化しない．}
\end{itemize}

LD命令は，メインメモリーの指定した番地の内容(データ)を汎用レジスタにコ
ピーする．一方，LAD命令は，その番地(実効アドレス)を汎用レジスタにコピー
する．

実効アドレス(adr,[x])の指定に10進定数や16進定数を指定することにより，
直接，汎用レジスタに値を格納することができまる．そのため，汎用レジスタ
に初期値を設定したり，制御変数の値を操作するときに使われ，非常に使い勝
手のある命令になっている．
%
%--------------------
\subsubsection{例}
%--------------------
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
      LAD  GR0,A      ;ラベルAの実効アドレスをGR0へコピー
      LAD  GR0,A,GR1  ;(A+GR1)をGR0コピー
      LAD  GR0,4      ;GR0の内容を4に設定
      LAD  GR1,0,GR2  ;GR2の内容をGR1へコピー
      LAD  GR1,3,GR2  ;(3+GR2の内容)をGR1へコピー
      LAD  GR1,1,GR1  ;GR1の値を1増加させる
      LAD  GR1,-1,GR1 ;GR1の値を1減少させる
 \end{verbatim}
\end{quote}
%
%
%=====================================================================
\end{document}



