Accumulator)は、総和を得るといったような計算に使うレジスタや変数のことである。CPUのアーキテクチャに関連してアキュムレータと言うと、演算装置の演算結果を必ず入れる特別なレジスタのこと。現代でもMCU(マイクロコントローラ)の一部はアキュムレータを採用している。概説[編集]CPUのアキュムレータアキュムレータと演算装置(ALU)の関係図。この図ではハンガリー語でAkkumulátorと書かれているが、英語ならAccumulator。この説明はつまり、「アキュムレータ」というのは、現在流に解釈すれば、レジスタの一種を古風な呼び方で呼んでいるもの、ということを言っている。(ただしこの説明では不十分であり、たしかにレジスタの一種ではあるが、実際には特別な位置づけのレジスタであり、演算装置との関係が特別なレジスタである。それを続いて説明する。)アキュムレータというレジスタは、演算装置(ALU)で行われた演算の結果の値が必ず送り込まれるレジスタであり、次の演算の際には、その値が、2つのオペランド(被演算子)の片方として扱われ、再び演算装置に送り込まれる、というものである。1970年代や1980年代のCPUでは、CPUに搭載できるトランジスタの数がかなり限られていたので、構造を簡素にしてトランジスタの数を減らすために、アキュムレータ方式というアーキテクチャが採用された。CPU内部では数の総和を求める作業は頻繁に行われているが、オペランドを次々と与えてゆき加算を繰り返してゆくと、このレジスタに総和の値(累積値)が入るわけで、この使用法がこのレジスタの典型的な使い方なのでアキュムレータ(累積装置)と呼ばれた。8080のAレジスタはアキュムレータである[2]。Z80も同様にアキュムレータを採用しており「アキュムレータマシン」と呼ばれている[3]。6502もアキュムレータを採用している[4]。アキュムレータとアセンブリ言語[編集]アキュムレータを使うCPUのアセンブリ言語では通常、例えば次のような命令でアキュムレータを使う。メモリ位置にある内容を読み出し、それをアキュムレータ上の値と加算し、結果をアキュムレータに格納する。命令上はアキュムレータは全く指定されていないが、この命令は暗黙のうちに必ずアキュムレータを使用する。このようにアキュムレータをオペランドとして明示的に指定することなく使うマシンをアキュムレータマシンと呼ぶ。複数のレジスタも持っているがアキュムレータとして特別扱いされるレジスタも持っている場合、ニーモニックにアキュムレータの存在があらわれるものもある。アキュムレータへのロードを行う命令(LDA)やアキュムレータから他へのストアを行う命令(STA)がある。現代のアキュムレータ[編集]現代のマイクロコントローラの一部でも、アキュムレータを採用している。2011年にルネサスから発売されたRL78は、(2021年までの)累計で50億個販売された[5]が、このRL78はアキュムレータマシンである[6]。マイクロコントローラには、アキュムレータとハーバード・アーキテクチャ(命令用メモリとデータ用メモリを別に置くアーキテクチャ)を組み合わせることで、簡素で低コストながら高性能なものがある。STマイクロエレクトロニクスのSTM8ファミリである。[7]現代のx86プロセッサにもアキュムレータマシン風のところがある。AXレジスタ(8ビットプロセッサ時代のAレジスタに由来する。32ビットではEAX)がアキュムレータ的に扱われており、初期の命令セットでは一部の命令(代表的なものはMULとDIV)のソースの一方およびデスティネーションが暗黙でAXとDXに固定されている、AXを対象とする命令には短縮形がある、などのように、AXレジスタにアキュムレータとしての特別扱いがあった。後に拡張されるに従い、アセンブリ言語レベルでは任意の命令に任意のオペランドが指定できるようになりこの特徴は見えなくなった。機械語レベルでは後方互換性を保っているのでこの特徴は残っている。AXレジスタは関数の返り値を格納するレジスタとして使われるなど「よく使われるレジスタ」であり、そういった意味でこの語が使われることもある。歴史[編集]アキュムレータという名称は、accumulate(累算する)に由来する。WSR-16のアキュムレータ(手前のホイールの右側の16桁の部分)1940年代のコンピュータについての資料である、フォン・ノイマンとGoldstineによる文献に次のようにある。「我々の算術器官の第一の部品は...並列記憶器官であり、数を受け取ってそれを既に格納している数に加算する。その内容をクリアすることもでき、内容を他に格納することもできる。我々はこのような器官をアキュムレータと呼ぶ。1]やENIACなどで採用されている」[8](現代風に解釈すれば)実行可能な命令は次のような操作をおこなう。