アセンブリ言語の基礎知識 Part 1

●コンピュータの基本的な構成

 コンピュータを動作させる場合において、最低必要な主要デバイスは2つあります。  それは、当然、CPUなどの演算処理をおこなうデバイス、そしてもう一つが、メモリなどの記憶をおこなうデバイスです。これは現在のコンピュータの仕様からみれば最低条件となります。
 えっ、マザーボードは?、ハードディスクは?なんて思うかもしれませんが、それはパソコンを自作するとかの話であり、ここで言っていることは、パソコンだけでなくてコンピュータといわれる洗濯機や電子炊飯器のマイコンなどが電子機器として動作させることができるために最低限の必要なものです。

●メモリ

 まず、メモリから見てみます。メモリには、データを格納できることは言うまでもありません。そして、メモリにはデータを格納する場所、位置を示すものに「番地」もしくは「アドレス」と呼ばれる識別値があります。通常、メモリには1バイト(8ビット)を最小としてデータの格納が行われ、その一つ一つの格納場所にアドレス値があります。
 64KB(バイト)のメモリの場合アドレスは0〜65535という値が付きます。64K=65536バイトのメモリに1バイトごとにアドレスがあるわけですから当然そうなりますよね。
 通常アドレスは、16進数で表記するのが一般的です。そうすると0000h〜FFFFhとなります。ここでhが付いてますが、これはHex=16進数を意味する言葉の頭の文字を使って、16進数であることを示すためです。こうしてみるとアドレスが、64kBだと4桁ですっきり収まりますから扱いやすいですよね。

 そして、格納されるデータですが、1バイト(8ビット)とお話ししましたので8ビットで表現できる値の範囲、0〜255までです。16進数にすれば00h〜FFhとなります。  

メモリ
番地 データ
0000h 00h
0001h 3Eh
0002h 10h


FFFEh 00h
FFFFh 06h
 

 さて、CPUとメモリを接続したとして、電源を投入したらどうなるか。CPUは必ず、メモリの頭から読み込んで動くように作られています。まあ、普通、パソコンであればそこにBIOSロムが頭にくるようになってますから、BIOSが動作するわけです。そういうことですから、結局、コンピュータの電源を落とさずに再起動させたければ、単純にメモリの先頭番地からCPUに処理させればリセットがかかるわけですね。

●CPUの基本構成

 CPUは内部に演算を行う演算回路、そして、データを記憶する記憶回路があります。細かく言うともう一つ制御回路ってのが入ります。
 演算回路はその名の通り、計算するためのものです。制御回路は、CPUを動かす命令の解析と実行を行う部分です。
 そして、記憶回路ですが、CPU内部にはアクセスが高速で非常に小さなサイズである「レジスタ」とよばれる記憶部分をもっています。このレジスタは、CPUが演算処理等を行うために用意されたCPU専用のメモリです。
 

レジスタ
 
 

 このレジスタの構成はCPUによって違い、ここではZilog社のZ80というCPUを例にして説明していきます。  AとかBとか言うのはレジスタの名前です。レジスタはメモリに比べ数がすくなくこのような名称がつけられていて、AレジスタとかBレジスタって呼びます。通常レジスタも最小サイズを1バイトとしてあります。ですので、A、B、C…がそれぞれ1バイトの記憶容量を持っています。当然ですが、このレジスタの名前もCPUによって違いますから、これはメーカーのCPU仕様書によって様々です。

 さて、この図をみるとAだけが1つで、ほかは、B、CやD、EやH、Lのように並べて書いてあります。これは、BC、DE、HLは2つを繋げて16ビットとして扱うことができ、またAだけは別名「アキュムレータ」レジスタと呼ばれ特別な扱いをされています。なぜ特別なのかというと、このレジスタだけは、CPUが処理する際、その処理結果が入れられることが多く、また、レジスタ中でも最も多く利用されるレジスタで、逆にこのレジスタを使わずにCPUを動かすことがほとんど不可能なほど要となるレジスタであるからです。

 このアキュムレータはどんなCPUにも用意されていまして、たとえば現在主流のIntel社のCPUであれば、AH、ALと呼ばれる2つのアキュムレータレジスタを実装しています。

●レジスタの役割とCPUの処理手順

 さて、このレジスタはどういった役割を持っているのでしょうか。

 CPUは細かく見ると非常に単純な動きの繰り返しをします。
 たとえばCPUに10+20を計算させるとした場合、その手順として

 10をAレジスタに格納
 20をBレジスタに格納
 AレジスタとBレジスタを加算
 その結果はAレジスタへ送る

のようにすることで処理ができます。

 命令によってレジスタへ数値を格納し、命令よって指定したレジスタを足し合わせる、そして最終的な結果はレジスタへ入ってくる。この繰り返しがCPUの計算処理の手順なのです。
 その結果をすぐ次の計算に使うのであれば、そのままでもいいでしょう。しばらく使わないのであれば、メモリへ保存しなければ、レジスタは別の計算で使うため値が消えてしまいますね。メモリに保存しておいたものをもう一度使うためには、またメモリからレジスタへ値を読み込む訳です。

 このようにレジスタは、CPUが演算処理などをするために用意された特別なものであります。メモリはプログラムを作る側が、任意にプログラムを入れたり、データを入れたりできますが、 レジスタはCPUが処理を行うためのものと目的が限定されているわけです。
 結局、逆に考えて、レジスタに値を入れて初めてCPUは計算できると考えてもいいでしょう。