福野泰介の一日一創

マシン語や、アセンブリ言語、高専で習いましたか?

コンピューターはマシン語で動く機械。家電が電機で動くくらいの基本です。
全小学生がプログラミングする時代、さらっと15分でマシン語の肝、押さえましょう。

前提知識は、鯖江市の小学4年生向け総合2コマでも実施しているプログラミング体験。
大きな文字が大人に優しい、はじめてのプログラミング with IchigoJam スライド資料3種のオープンデータ! KDDI連携、福井県小浜市編
まだの方は IchigoJam または IchigoJam web と上記スライドを使って、まずはさらっとご体験ください!

IchigoJam BASICを使った、1から100までの地道な足し算。

A=0:FOR I=1 TO 100:A=A+I:NEXT:?A 5050

AやIは変数と呼ぶ、コンピューター内の記憶です。Aはひとまず0と覚えてもらいましょう。 リファレンスを見ると、FORとNEXTコマンドでIが1から100まで繰り返すことがわかり、変数Aがどんどん書き換えられて、最終的に?(=PRINT)で、表示するプログラムと読めると思います。(A=A+1 は LET A,A+1 の省略形)

コンピューターは数の計算しかできません。上記のプログラムもすべて数として処理されています。IchigoJam BASICというOSは、かかれたプログラムを1文字ずつ文字コードを照合しながら、知っている言葉を見つけたら、その処理を行うことを繰り返します。知らない言葉に遭遇したら「Syntax error」と返すのもOSの役目です。

一文字ずつ、丁寧に処理しているので、真の力は発揮できていません。
そこでマシン語の登場です!

?USR(#800,100) Segmentation Fault

指定したメモリをマシン語として解釈して、動かすコマンドUSR(ユーザー)を使うと、エラーになります。(IchigoJam 1.4未満だと固まるので、電源入れ直しましょう)

IchigoJamで使っているNXP社のCPU LPC1114は、Arm Cortex-M0アーキテクチャーなので 0-65535(16bit)の数(=マシン語)によって動作を指定します。
BASICと同じように、繰り返し足し算するプログラムをマシン語でいれてみます。

LET[0],#2100,#1841,#3801,#D1FC,#4608,#4770 ?USR(#800,100) 5050

LETコマンドは配列に連続した値をセットしていきます。HELPコマンドで確認できますが、IchigoJamの配列はコンピューター内のメモリ#800(16進法で800という位置)に記憶された数の並びです。

マシン語を解読してみましょう! Armマシン語の仕様は2進法で区切ると読みやすいので、BIN$コマンドを使います。

?BIN$([0],16) 0010000100000000

マシン語表をみて、0と1の並びが一致するものを探しましょう。 早速、一番最初の Rd=u8 が、一致しますね。Rdの部分、6〜8番目が0なので、2進法で001、つまりR1、その後8bitが全部0、つまり R1=0 と解読できます。(R0〜R15は、CPUがもっている記憶領域、レジスタと呼びます)

同じように、6つのマシン語を解読していきましょう。

FORI=0TO5:?HEX$([I],4),BIN$([I],16):NEXT 2100 0010000100000000 1841 0001100001000001 3801 0011100000000001 D1FC 1101000111111100 4608 0100011000001000 4770 0100011101110000

解読すると、下記のような動作をしていることがわかります。

R1=0 R1=R1+R0 R0=R0-1 IF !0 GOTO -2 R0=R1 RET

IF !0 GOTO n8 は、ちょっとややこしいです。11010001の並びでまずマシン語がわかります。n8とは、2進法で8bit(8桁)使った飛び先を指定しますが、一番上の桁が1になっているものはマイナスの数を表します。全部8桁、全部が1だと-1、最後が0だと-2・・・と続く、2の補数表現を使います。 -4だとわかりますが、実はこれに2を足した場所 -2 が飛び先となります。R0を1減らして、0でなければ2つ前のマシン語、R1=R1+R0 のマシン語へ飛びます。

RETでBASICに戻ってくるときの R0 の値が、USRコマンドの値となって、表示されます。

CPU、Arm Cortex-M0 アーキテクチャーのLPC1114の最大動作周波数は50MHz、IchigoJam標準の設定では48MHzで動かしています。 1Hzは、1秒間に1回という単位、M(メガ)は、100万の意味。ほとんどのマシン語を1つ1クロックで処理するので、秒間最大5000万回で計算できるというわけです!

ループさせずにRETで戻らせてみたり、引き算、掛け算など、いろいろいじって思い通りになったり、ならなかったり、遊んでみましょう!

命令をいろいろ組み合わせれば何でもできそうな感が伝わりましたか? このマシン語をいい感じに生成するプログラムのことをコンパイラやランタイムと呼び、C言語をはじめ、いろいろな言語が動いている裏っ側となります。
(参考、C言語開発者「C言語は初心者にはお勧めできない」 エントリーにオススメBASICは、世界初のクラウド対応言語だった!

スマホで使われているのは 64bit化された Arm Cortex-Aシリーズ、PCでは Intel/AMD、これから活躍楽しみな RISC-Vなど、CPUによってマシン語の違いはありますが、基本は同じです。

もうちょっとマシン語遊んでみたい人は、こちら「はじめてのマシン語」をどうぞ!
マシン語も分かったし、いろいろ作ってみたい人にオススメは、JavaScript。サーバーからスマホ、PC、ゲーム機まで動くプラットフォーム数、最高です!

プログラミング好きな高専生、鯖江の自然豊かな古民家でのインターン、来てみませんか?

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像 / RSS