マシン語を最後に使ったのはいつだっただろうか、と思い出せないくらい最近は縁がありませんでした。(スーパーファミコンのプログラム以来・・)
ところがFPGAを扱うようになってから「CPUの気持ち」をもう一度復習したいと思い、今回とりあげてみました。(マシン語はプログラミング言語というより、CPUから見たデータです)
身近なマシン語環境といえば、最近よく使っているIchigoJamです。遅いマシンの方がマシン語の速さを実感できるので最適です。
参考:
http://fukuno.jig.jp/1188
http://ichigojam.net/armasm.html (Cortex-M0 ARMマシン語表)
メモリにマシン語プログラムを配置して、開始アドレスから実行するのに、BASICのコマンドを使います。ここではIchigoJamの配列データ領域が#800番地になっていることを利用して、配列にプログラムを格納します。POKEコマンドだと8bitで書き込まなくてはなりませんが、配列の場合16bitで便利だからです。
高速処理を体感するのに画面表示をします。BASICだと遅い画面表示がマシン語だと一瞬のうちに画面全体を埋め尽くします。(ビデオRAMに直接書き込みます)任意のキャラクタで画面全体を埋め尽くすプログラムをマシン語で作り、これをBASICから呼び出します。
高速に画面がフラッシュ様子が確認できると思います。
疑似コード
1 2 3 4 5 6 7 8 9 10 11 |
R3=9 R3=R3<<8 R4=9 R4=R4<<8 R4=R4+R0 [R1+R3]=R4 R3=R3+1 R2=R3>>8 R2-12 IF !0 GOTO -4 RET |
VRAMが#900番地からで、9を8bitシフトしたものに1ずつ足した場所にキャラクタコードを書き込んでいきます。(これも#900から)
R0はUSR()関数の引数になります。
R1には、BASICで使うメモリアドレスがセットされます。
一行ごとマシン語表を見ながらビット列に翻訳して配列に格納します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
10 [0]=`0010001100001001 20 [1]=`0000001000011011 30 [2]=`0010010000001001 40 [3]=`0000001000100100 50 [4]=`0100010000000100 60 [5]=`0101010001011100 70 [6]=`0011001100000001 80 [7]=`0000101000011010 90 [8]=`0010101000001100 100 [9]=`1101000111111010 110 [10]=`0100011101110000 120 CLS 130 FOR I=1 TO 20 140 R=USR(#800,I) 150 WAIT 10 160 NEXT |
参考サイトとほとんど同じコードですが、実際に意味を考えて打ち込んで(コーディングして)みて実行すると理解が深まります。
VRAM直書きによる高速化はNEC PC-9801時代にもよくやりました。またRS-232Cでの通信プログラムでは、C言語では遅いということでアセンブラ(マシン語を文字で表現したもの)を使用したり、マシン自体が遅い時代には、この違いをよく体感することがでました。
マシンの進化とともに言語の高級化もすすみ高機能なプログラミング開発環境が普及してきましたが、最近はマシンの進化以上に処理するデータが重くなりすぎて、FPGAのようなローレベルプログラミングが必要とされるようになってきたような気がします。(http://decode.red/blog/20161229641/)
このためのトレーニングにもIchigoJamはとても役に立ちます。
BASICは単に言語・文法ではなく、環境であり、マシン語が簡単に使える点でとても優れていると思っています。