プログラムをひとつひとつマシン語対応表を見て、2進数列にして打ち込んでいくことをハンドアセンブルといいます。手(ハンド)で組み立てる(アセンブル)ので、ハンドアセンブル、てづくりですねっ!
IchigoJamのマシン語では、レジスタというBASICで使う変数のようなものが使えます(ひとまず安全に使えるのは、R0-R3の4つ)。レジスタに値をいれたり、レジスタ同士で計算して、その結果によって分岐(BASICでいうGOTO)することで、プログラムを組み立てます。
まずは、指定した数字までを足し算するマシン語プログラムをつくってみます。
BASICから渡される数は、レジスタR0に入っていて、RETした時に同じくレジスタR0に入っている数がUSRコマンドの値となります。
まずは実験 R0=R0+1 をハンドアセンブルしてみましょう。
下記の表から、演算の一番上 00110 が該当します。Rd = R0 なので、0を2進数3桁で表す 000、足す値は 1 を2進数8桁で表す 00000001
これを全部くっつけると
0011000000000001
という16bitのマシン語ができあがります。
マシン語プログラムからBASICへ戻る、分岐内にある RET 0100011101110000 を付け加えて、前回やったように上位8bitと下位8bitを入れ替えて書き込みます。
POKE #700,`00000001,`00110000,`01110000,`01000111 ?USR(#700,10) 11
では、繰り返し計算させてみます。
R1=0 R1=R1+R0 R0=R0-1 IF !0 GOTO -2 (計算結果が0でなければ2つ前の命令にジャンプ!) R0=R1 RET
これをハンドアセンブルすると...
00100 001 00000000 (R1=0) 0001100 001 000 001 (R1=R1+R0) 00111 000 00000001 (R0=R0-1, ※0001111 001 000 000 でもok) 11010001 11111100 (指定の-2から更に-2した-4の2進数表現256-4=252を使う) 0100011000 001 000 (R0=R1) 0100011101110000 (RET)
IchigoJamに書き込み、実行してみます。
POKE #700,`00000000,`00100001 POKE #702,`01000001,`00011000 POKE #704,`00000001,`00111000 POKE #706,`11111100,`11010001 POKE #708,`00001000,`01000110 POKE #70A,`01110000,`01000111 ?USR(#700,10) 55 ?USR(#700,100) 5050
動きました!
ミッション1. BASICで同じようなプログラムをつくって速度を比べてみましょう
ミッション2. 階乗(指定した値まで掛け算する 3の階乗=1*2*3)するマシン語プログラムをつくってみましょう
IchigoJamで使えるマシン語表(基本編)
負の数は補数表現(256を足した数、-1 = 255、-2 = 254・・・)を使用する
命令2コ前に飛ばしたいとき252、3コ前の時251・・・
IchigoJamのCPU、NXP社のLPC1114FN28は、Arm社のCortex-M0をベースに作られています。Cortex-M0で動くマシン語が、16bitが基本のシンプルで美しいArm Thumb-2命令セットです。
多くのスマホやタブレットでもArmアーキテクチャーが使われていて、この命令セットと互換性があります。つまり、Armマシン語をマスターすれば、超高速動作するiPhoneアプリを創ることができちゃうかも!?
- 連載、IchigoJamではじめる、Armマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法
12. レジスタ不足に上位レジスタとスタック操作
13. コンパイラはじめのいっぽ、EVAL実現法とマシン語生成
14. サイズを取るかスピードを取るか、割り算のアルゴリズムとマシン語実装
15. マシン語化で1万倍速!? セットで学ぶアルゴリズムとコンピューター