0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TurbowarpCPU 機械語の解説メモ

Posted at

この記事はnand gameのSoftwareレベルのネタバレを含みます。

この記事に出てくる機械語はわかりやすくするために本来入るべきではないところにスペースを入れています。

本記事の内容は筆者の理解に基づいており、正確性に欠ける部分があるかもしれません。

前置き

このメモでは、以前作成した TurbowarpCPU における機械語(命令セット)の仕様を簡潔に解説する。

cpuの概要と基礎知識

cpuについて

このCPUには、AレジスタDレジスタという2つのレジスタがあり、それぞれを変数のように使うことができます。

  • Aレジスタ
    メモリのアドレスを指定するために使われる。
    数値を一時的に保持することもでる。

  • Dレジスタ
    演算などで使うための一時的な記憶場所。
    主に計算やデータのやり取りに使われる。


このCPUでは、以下の3つの変数が使える:

A:Aレジスタに格納されている値(数値やアドレス)。
D:Dレジスタに格納されている値(演算用のデータ)。
*A:Aレジスタの値をアドレスとして使い、そのアドレスが指すメモリの中身を表す。


この画像を見ると理解しやすい
https___qiita-image-store.s3.ap-northeast-1.amazonaws (1).png
(Aの値が2なので*Aはアドレスが2ときのメモリの内容を示している)

コードについて

フォーマット

一般的に
[ターゲット] = [オペレーション]:[ジャンプ]
のような感じで書く(これを二進数に直して入力する)

説明

ターゲット演算結果が書き込まれるレジスタ(変数)を指定(省略可能)
オペレーションALU演算処理
ジャンプジャンプする際の条件を指定(省略可能)

サンプルコード

D=0
A=2
D=D+1
0:JMP

命令の種類&解説

このcpuには大きく二つの命令がある。

A命令

フォーマット

0 vvvvvvvvvvvvvvv

0からはじまる。
v•••格納する値

機能

Aレジスタに15ビットの値を格納する。

サンプルコード

0 000000000000010

Aレジスタに2を格納

C命令

フォーマット

1 ---- ooooo ttt jjj

1から始まる
-•••特に意味はない(1でも0でもいい)
o•••オペレーション(左から順にu op1 op2 zx sy)
t•••ターゲット(左から順にa d *a)
j•••ジャンプの種類(左から順にlt eq gt)

機能

演算、ジャンプ、レジスタ制御など

命令フィールド詳細

オペレーション

•uは1なら 算術演算 、0なら 論理演算 系の命令になる。

•op1、op2はその中(⇑)の命令を区別する。

•zxが1なら入力(XとYの2つのうちX)が0になる。
(値をコピーしたり正負を逆にしたいときなどに使用されるものと思われる)
例: A=DD=-Dなど

•swが1なら2つの入力を反転させる。(X→Y,Y→Xとして回路に入力される)
例:D-AA-D

コード

意味 u op1 op2 zx sw
D+A 1 0 0 0 0
D-A 1 1 0 0 0
A-D 1 1 0 0 1
D+1 1 0 1 0 0
A+1 1 0 1 0 1
D-1 1 1 1 0 0
A-1 1 1 1 0 1
-D 1 1 0 1 1
-A 1 1 0 1 0
-1 1 1 1 1 1
1 1 0 1 1 1
D 1 0 0 1 1
A 1 0 0 1 0
D(and)A 0 0 0 0 0
D(or)A 0 0 1 0 0
(not)D 0 1 1 0 0
(not)A 0 1 1 0 1
0 0 0 0 1 0
ターゲット

•演算の結果を代入する対象のこと。
0:JMPのようにターゲットを省略することは可能。
(この場合0はオペレーション。:JMPはジャンプ命令)

コード

意味 a d *a
(void) 0 0 0
A= 1 0 0
D= 0 1 0
*A= 0 0 1
A,D= 1 1 0
D,*A= 0 1 1
A,D,*A= 1 1 1
ジャンプ

•代入(実行)後の値を評価してジャンプするか決める。

•Aレジスタの値がジャンプ先(のアドレス)になる。

•Tとはターゲットの値のこと。

•lt eq gtとは順に less than(未満)equal(等しい)greater than(より大きい) という意味であり、比較対象はTと0だ。

コード

アセンブリ名 意味 lt eq gt
(void) 省略 0 0 0
JLT T < 0 1 0 0
JEQ T == 0 0 1 0
JGT T > 0 0 0 1
JLE T <= 0 1 1 0
JGE T >= 0 0 1 1
JMP 無条件 1 1 1

サンプルコード

1 0000 11100 010 010 //Dを1減らす。Dが0ならジャンプ

サンプルコード

このコードは『コードについて』のサンプルコードを機械語に直したものだ。

1 0000 00010 010 000 //Dレジスターに0をセット。  C命令
0 000000000000010    //Aレジスターに2をセット。  A命令
1 0000 10100 010 000 //Dレジスターに1を加える   C命令
1 0000 00000 000 111 //無条件ジャンプする。(2行目)C命令

このコードでDレジスタのカウンターができる。

まとめ

この記事が、少しでもCPUや機械語に興味を持つきっかけとなれば幸いだ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?