IchigoJamのCPUは、NXP社のLPC1114、ArmのCortex-M0アーキテクチャで作られています。Cortex-M0は、Thumb-2という命令のサブセットが使われていて、1つの命令は基本16bit、2byteで記述します。メモリ(RAM)や、FlashROMに記録された命令を順に実行することでコンピューターは動きます。
IchigoJamは、IchigoJam BASICというC言語で開発しているプログラムをこのThumb-2命令に変換(コンパイルという)したものがFlashROMに書かれているので、IchigoJamとして動いているわけです。
では、このマシン語を試してみましょう!(IchigoJam web でも試せます)
CPUが次に実行するメモリの位置(アドレスという)を指定するコマンド USR(ユーザー) を使ってみます。
?USR(#800,0)
IchigoJam 1.4では「Segmentation Fault」とエラーが出ます。古いバージョンではそのまま固まってしまうかもしれません。アドレス#800は、HELPコマンドで見ると「VAR」という配列と変数のデータが書いてある領域と、画面の状態を表す(VRAM)へと続きます。これを命令として解釈するためでたらめな動きをしてしまいます。
「Cortex-M0 Armマシン語」を見ながらちゃんとした命令を書いてみましょう。まずは何もせずにすぐに処理を戻す動きを試してみましょう。BASICでいうRETURNコマンドに相当します。
「Cortex-M0 Armマシン語」の後半部分、分岐セクションの「RET (=#4770)」を使います。#800は配列からスタートするので、16bitの命令と同じなので好都合です。
[0]=#4770 OK ?USR(#800,0) 0 OK
今度は正常に値が返ってきました!
USRコマンドは実行するアドレスと、R0というCPU自体が使う変数(レジスタという)にセットする値を指定しています。手始めに、この値に1足してみましょう。
[0]=`000110 000 00000001 OK [1]=#4770 OK ?USR(#800,10) 11 OK
[0]にセットしたのは「Cortex-M0 Armマシン語」の演算セクション、一番上「Rd+=u8」。000110で始まり、R0なので、Rdの3bitを000にセットし、8bitで表すu8の部分に00000001をセット。16bitの命令ができました。IchigoJam BASICの2進法表記「`」を使って、配列の1つ目にセット。2つ目の[1]にRET=#4770をセットして、実行!
引き算や、値セット、掛け算などいろいろ試してみましょう。この命令を組み合わせればコンピューターネイティブの言葉でのプログラムができます!失敗したらすぐにおかしくなる(暴走という)のがマシン語。プログラムにして保存(SAVE)してから実行するといいでしょう。
ひとつひとつ命令を調べるのは大変なので、そこをプログラムにしたものがアセンブラや、コンパイラと呼ばれるものです。
もうちょっとマシン語の世界を知りたい人は「マシン語入門」をどうぞ!
links
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1
- 壊して学ぶコンピューターとメモリの関係、IchigoJamの簡易モニターでメモリ探検!