どのような2進法表現でどう動くかはコンピューターによって違います。
IchigoJam Rで使っているコンピューターは、16コの0か1のカタマリ(16bit/16ビット)で動きをコントロールします。
0000010100000101
これはX10レジスタというコンピューターの一時記憶の1番目に1を足すというマシン語です。(RV32C RISC-Vマシン語表)
最初の3bitと最後の2bitが足し算をしろという命令コード(c.addi)、一つ飛ばして5bitが使うレジスタの番号、残りの6bit(bit12とbit6-2)が足す数です。
000 0 01010 00001 01
これをPOKE文を使ってメモリに書き込みます。
POKE#700,`00000101,`00000101
#700はメモリの位置を表します。`は2進法で数値を表します。
下位の8bitを先に、上位の8bitを後に書くのがこのコンピューターのルールです(リトルエンディアン)。
動かすにはもう1つ命令が必要です。IchigoJamからの呼び出しから戻って来いという命令です。 (BASICのGOSUBに対して、RETURN的なもの)
1000000010000010
この呼び出し元に戻るマシン語も同じようにメモリに書き込みます。
POKE#702,`10000010,`10000000
準備ができたので実行してみます。
?USR(#700,1)
結果に正しく2と返って来ましたか?
マシン語は間違えると、IchigoJamのシステム自体が停止してしまいます。
安全策が無い分、コンピューターのフルパワーが出せるのがマシン語の最大のメリットです!
長いプログラムをつくった時は、保存してから動かしましょう。
USRコマンドは呼び出しメモリ位置と、渡す数を指定します。100を渡して結果を確認してみてください。
?USR(#700,100)
メモリを書き換えて5足すプログラムに変更してみましょう。(ビット演算で2bitずらし、c.addi命令を表す末尾01を足す。リトルエンディアンなので後8bitがメモリ上では先にくることに注意)
POKE#700,5<<2+1 ?USR(#700,100)
足す数を変更できました。
このような計算命令や、計算した結果によって処理を変更する命令などのマシン語でコンピューターは動いているわけです。
応用編「IchigoJam Rβでも輝くWS2812B、RISC-Vマシン語で10ナノ秒単位で制御する」
RISC-V版マシン語はじめのいっぽの連載、はじめます!
- 連載、IchigoJamではじめる、Armマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法
12. レジスタ不足に上位レジスタとスタック操作
13. コンパイラはじめのいっぽ、EVAL実現法とマシン語生成
14. サイズを取るかスピードを取るか、割り算のアルゴリズムとマシン語実装
15. マシン語化で1万倍速!? セットで学ぶアルゴリズムとコンピューター
- 参考リンク
命令一覧「Cortex-M0 テクニカルリファレンス マニュアル - Arm」
マシン語の仕様「Armv6-M アーキテクチャ リファレンス マニュアル - Arm」 - 登録するとダウンロードできます
マシン語の仕様(日本語)「Armv5 Architecture Reference Manual Japanese - Arm」 - バージョン違いですが、日本語です
Arm Cortex-M0 1,500円 BASICパソコン 「IchigoJam」
福野ツイート「プログラミングをC言語からはじめるのは、免許取っていきなりランボルギーニ乗るようなもの」