2022-04-05
簡易モニターでメモリ体験をした後は、コンピューターが分かる真の言葉、マシン語(または機械語)を体験してみましょう。

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の簡易モニターでメモリ探検!

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