アットウィキロゴ

計算機の原理

加算

基本的に、二進数の計算は、0+0=0, 0+1=1, 1+0=1, 1+1=10の4通りしかない。
このうち最後の1+1だけは上への桁への繰上り(1+1=10)が起きる。
これらはスイッチングを使えば、繰上りの有無はAND回路、1桁目の加算後の数値はEXOR回路で実現できる。
実際は、下の桁からの繰上りを考慮しなければならないため、これは完全ではない。なので、これを半加算器と呼ぶ。
下の桁の繰上りを考慮した全加算器は、2つの半加算器をOR回路でつなぐことで実現できる。

減算

減算は、二の補数(全ての数を反転させてその数に1を加えた数)で実現できる。
必ず桁あふれするのだけを考慮しなければ、元の数と二の補数を加えた数は必ず0になる。

乗算・除算

乗算・除算については、小学校の算数で習う「筆算」のようにすれば実現可能。

パイプライン処理

パイプライン処理とは、CPUが実行するオペランドの解読などの段階的処理を、並列でひとつひとつずらしながら行う処理のこと。
特にRISC CPUでは、命令が単純化されているため、パイプライン処理の効率がよくなる。

キャッシュメモリ

キャッシュメモリは、主メモリよりも速度が速い代わりサイズが小さく値段も高価なメモリのこと。
キャッシュメモリに書き出す時に、必ず元のデータに同時に書き出して次の処理を行うライトスルー方式と、元のデータに書き出される前から次の処理を行うライトバック方式がある。

機械語命令

機械語命令の基本は、以下の3つ。

  1. レジスタにメモリ・IOからデータを転送する
  2. レジスタのデータを演算する。
  3. レジスタからメモリ・IOにデータを転送する

どんなに複雑なプログラムでも、この3つの組み合わせで動いている。
レジスタには、AX, BX, CX, DXなどの名前がついており、「CPUが一時的に記憶に使うための高速なメモリ」だと考えればよい。また上位8ビットにはAH, 下位8ビットにはALのような略号がつけられている。
たとえば、

ADD AL, 40h

でALに40を足す。

SUB AL, 20h

でALから40を引く。

MUL BL

でALとBLを掛けてAXにセット。

DIV BL

でAXをBLで割って商をALに、余りをAHにセット。

注意:このレジスタやオペランドの形式は16bit時代のものなので、64bit時代の今のCPUではレジスタ名などが変わっています。
また、これだけでは「実際の計算結果をどこかに保持しておく」ということができない。そのため、主記憶へのアクセスを行う。
データの転送は、

MOV 受け取る側, 送り出す側

とする。たとえば、

MOV AL, 0FFh

とすれば、FFをALにロードできる。
書き込む場合は、メモリアドレスを使って書き込むことができる。アドレスは[]を使って指定する。

MOV AL, [0201h]

ほかには、比較命令、ジャンプ命令、論理命令、スタックポインタ命令、入出力命令などが存在する。

JMP XX

で、オフセットアドレス「XX」に無条件ジャンプする。
このほかにもJZ(ALが0ならばジャンプ)のような条件付きジャンプ命令がある。
また、ファンクションコールといって、特にDOSのシステム命令などを実行したりできる。これは端末の入出力に使ったりする。
また、実際のアセンブリ言語で開発する場合は、マクロアセンブラ(MSAM)を使うことで、ラベルを使うことができる。ジャンプをオフセットアドレスではなくラベルで使える。

最終更新:2026年01月09日 13:43