オリジナル4ビットCPU「DL166」はプログラミングの基礎学習に最適:オリジナルCPUでバイナリコード入門(1)(2/2 ページ)
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第1回はオリジナルCPU「DL166」のインストラクションセットについて解説する。
「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の回路設定をシアトル行きの飛行機の中で書き上げたのですが、その便名からとっています。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「オリジナルCPUでバイナリコード入門」バックナンバー
- ≫連載「注目デバイスで組み込み開発をアップグレード」バックナンバー
- ≫連載「Black Hatでハードウェアハック!」バックナンバー
- マブチモーターをArduinoで制御する
「マブチモーター」でもおなじみ「直流ブラシ付きモーター」は安価で入手性もよいモーターです。これをArduinoで制御するとしたら、何を理解して何を用意して、どんなプログラミンが必要でしょうか。実験します。 - 初歩から学ぶ、マイコン開発とARMプロセッサー
組み込みの世界では最も成功したプロセッサの1つ「ARM」を用いたマイコン開発にチャレンジします。クラウド開発環境「mbed」を使い、プログラムを書きながら回路をブレッドボードに実装、動作を確認しながらさまざまな内蔵デバイスの使い方をマスターしていきます。 - Webブラウザではじめるフィジカルコンピューティング――Scratch 2.0とは?
電子回路が苦手な人のためのフィジカルコンピューティング入門。Webブラウザだけでプログラム開発から実行まで行える「Scratch 2.0」を用い、センサーの接続や外部デバイスのコントロールに挑戦する! フィジカルな世界とつながるプログラミングを体験することで、今までにない発想がひらめくかも!? 第1回は、Scratch 2.0の特徴と開発環境について説明する。