オリジナル4ビットCPU「DL166」はプログラミングの基礎学習に最適オリジナルCPUでバイナリコード入門(1)(2/2 ページ)

» 2023年02月14日 07時00分 公開
[今岡通博MONOist]
前のページへ 1|2       

「DL166」のインストラクションセットの概要

演算系命令

バイナリ ニーモニック 記載
01-000-sss ADD (sss) acc=acc+(sss)
01-001-sss OR (sss) acc=acc or (sss)
01-010-sss AND (sss) acc = acc & (sss)
01-011-sss XOR (sss) acc = acc ^ (sss)

 1つ目のADD (sss)を例に、演算系命令について説明します。バイナリの最初の01-000はADD加算命令を示しています。8ビットの2進数をハイフンで区切ってますが、これは見やすくすためで、実際のインストラクションセットのバイナリは8桁の2進数です。sssはレジスタ番号を示しています。例えば、sssが001の場合は汎用レジスタのR1を示しています。この場合、バイナリは01-000-001となり、16進表現では0x41となります。このCPUがこのインストラクションセットをメモリから読みだすと汎用レジスタの値とアキュムレータR0を加算して結果はアキュムレータR0に保存されます。

 AND (sss)は論理積、OR (sss)は論理和、XOR (sss)は排他的論理和で、加算命令であるADD (sss)と演算が異なるだけで、ここで説明した約束事に従って理解できると思います。

バイナリ ニーモニック 記載
01-100-sss INC (sss) (sss)=(sss)+1
01-101-sss NOT (sss) (sss)=!(sss)

 INC (sss)もsssの解釈はADD (sss)と同じようにレジスタの指定になります。指定されたレジスタに1を足し結果はsssで指定されたレジスタに保存されます。先述した演算系のインストラクションセットでは、計算結果はアキュムレータにのみ保存されましたが、INC (sss)は指定したレジスタに保存されます。

 NOT (sss)は指定したレジスタの値を論理否定し、その値をsssで指定したレジスタに保存します。

バイナリ ニーモニック 記載
01-110-sss RROTATE (sss) regs[sss]=regs[sss]>>1+(regs[sss]<<3 & 4'b1000)
01-111-sss LROTATE (sss) regs[sss]=regs[sss]<<1+(regs[sss]>>3 & 4'b0001)

 RROTATE (sss)はsssで指定したレジスタのビットを1つずつ下位ビットにずらします。その結果を指定したレジスタに保存します。もしも最下位ビットが1だった場合は最上位ビットを1とします。

 LROTATE (sss)はsssで指定したレジスタのビットを1つずつ上位ビットにずらします。その結果を指定したレジスタに保存します。もし最上位ビットが1だった場合は最下位ビットを1とします。

バイナリ ニーモニック 記載
10-00-#### JNC #### if (C==0) PC=#### else PC=PC+1
10-01-#### JMP #### PC = ####

 順番が逆になりますが先にJMP ####から説明します。この命令は実行を任意の番地に移動します。移動できる番地の範囲は0番地から15番地です。移動先の番地は####の4ビット長で指定します。ここで初めて登場した####ですが4ビット長で表せる値を示しています。

 JNC ####はキャリー(桁あふれ)フラグを示すCが0の場合に####で指定した番地に実行が移ります。キャリーフラグが1の場合には次の番地に実行が移ります。さて、ここでキャリーフラグですが、このフラグがセットされるのはADDとINCのインストラクションの実行時です。この演算が実行されたときに4ビットを超える演算結果を得ると、このフラグが1にセットされます。

バイナリ ニーモニック 記載
10-10-#### MVI #### acc=####
00-ddd-sss MOV (ddd),(sss) (ddd)=(sss)

 MVI #### はアキュムレータR0に####で示した4ビット値を直接代入する命令です。

 MOV (ddd),(sss)はレジスタ間で値をコピーするための命令です。dddで指したレジスタにsssで指し示したレジスタに値がコピーされます。sssで示したレジスタの値には変化はありません。

おわりに

 これから数回にわたって、読者の皆さんと一緒にバイナリコードの世界に飛び込んでいくのですがその最も頼りになる相棒が、今回紹介したDL166です。読者の皆さまに親しんでもらえたらと思います。ちなみに命名の由来ですが、実はこのDL166の回路設定をシアトル行きの飛行機の中で書き上げたのですが、その便名からとっています。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.