2021-02-06
コンピューターが本当にわかる言葉は0か1のカタマリ(2進法)で表現されたマシン語だけです。

どのような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言語からはじめるのは、免許取っていきなりランボルギーニ乗るようなもの

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS