create every day - 福野泰介の一日一創

楽しさ広がるマルチバイトメモリアクセスとスタック - IchigoJamではじめるARMマシン語その5

2016/08/11 23:55:00
#IchigoJam #ARM 

IchigoJam BASICで扱える数は、メモリ節約のため16bitの整数(-32768〜32767)としていますが、CPUは32bitのLPC1114。マシン語を使えば、プラスマイナス約21億まで使った高い精度で高速に計算ができます。

その3では1byte単位のメモリアクセスをやりましたが、ARMマシン語には、IchigoJamの変数をマシン語で扱うのに便利な2byte単位や、32bitの大きな数をそのまま読み書きできる4byte単位のメモリアクセスも用意されています。

ARMマシン語表(メモリアクセス)

※[]の後のWだと2byte単位、Lだと4byte単位で読み書き。u5/2などの表記は2で割った数を指定という意味。

これを使って、IchigoJamの変数AとBを足した値をCにいれるマシン語プログラムをつくってみます。 (R1:IchigoJam BASIC上の仮想アドレスを実アドレスに変換するオフセット)

R0=8 R0=R0<<8 R0=R0+204 R0=R1+R0 '仮想メモリ #800+204 の変数Aの実アドレス位置を計算 R2=[R0+0]W '変数Aの16bitの数をR2へ入れる R3=[R0+2]W '変数Bの16bitの数をR3へ入れる R2=R2+R3 [R0+4]W=R2 'R2を変数Cへ入れる RET

これを「マシン語表」を見ながらハンドアセンブルして、実行します

[0]=`00100 000 00001000 'R0=8 [1]=`00000 01000 000 000 'R0=R0<<8 [2]=`00110 000<<8 + 204 'R0=R0+204 [3]=`0001100 000 001 000 'R0=R1+R0 '仮想メモリ #800+204 の変数Aの位置 [4]=`10001 00000 000 010 'R2=[R0+0]2 '変数Aの16bitの数をR2へ入れる [5]=`10001 00001 000 011 'R3=[R0+2]2 '変数Bの16bitの数をR3へ入れる [6]=`0001100 011 010 010 'R2=R2+R3 [7]=`10000 00010 000 010 '[R0+4]2=R2 'R2を変数Cへ入れる [8]=#4770 'RET =HEX$(`0100011101110000) A=100 B=555 R=USR(#800,0) ?C 655

うまくいきました!

R0からR3までの4つのレジスタだけではちょっと窮屈ですね。そんなとき便利なのがスタックです。メモリに書類を積むように一端保存しておき、必要になったら上から順番にレジスタに戻します。積むことをPUSH(プッシュ)、戻すことをPOP(ポップ)と呼びます。


ARMマシン語表(スタック操作)

※ひとまず LR、PC には 0 を指定して使ってください

PUSH {R4,R5,R6,R7} と、スタックに保存しておけば、R4からR7までを思う存分に使ってもOK。RETする前に、POP {R4,R5,R6,R7} としましょう。 (R4〜R7を保存しないといけない理由

[0]=`1011010 0 00010000 'PUSH {R4} [1]=`00100 100 11111111 'R4=255 [2]=`0001100 100 000 000 'R0=R0+R4 [3]=`1011110 0 00010000 'POP {R4} [4]=#4770 'RET ?USR(#800,100) 355

全部PUSHしておいてもいいですが、1レジスタに付き4byteのメモリと約20ナノ秒(48MHzの1周期)の時間が無駄になるので、必要なだけPUSH/POPするようにしましょう。また、重ねてPUSHすることで、どんどん途中の数を保存しておくこともできます。ただし、PUSHした数とPOPした数が合わないと暴走やフリーズの原因になるので注意しましょう。

やってみよう
1. PUSHしてPOPせずにRETするとどうなるかやってみよう
2. A+B*Cを計算してDにいれるマシン語プログラムをつくってみよう
3. A+B*Cを計算して[0]にいれるマシン語プログラムが2度目には動かない原因を探ってみよう
4. A*Bの数をCとDの2つの変数に結果をいれるプログラムをつくってみよう
5. 変数X,Yの場所に4x4のキャラを表示するプログラムをつくり、BASICと速度を比べてみよう

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image