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

ARMマシン語でつくる32bit大きな数計算ライブラリ / 32bit Integer Library on IchigoJam

2017/05/08 23:55:00
#IchigoJam #asm #english 

メモリが4KBしかないIchigoJam、節約のため変数はすべて16bit。低い限界を楽しめる設計です。 もちろんプログラミングでその限界は超えられます。今回はマシン語を使って超える方法の紹介。
How to exceed the 16bit limit of IchigoJam!

@CALC32 PUSH {LR,R4,R5,R6} R6=8 R6=R6<<8 R6=R1+R6 R5=#F<<2 R4=R0 R0=R4>>2 R0&=R5 R0=[R6+R0]L R1=R4&lt;<2 R1&=R5 R1=[R6+R1]L R2=R4&gt;>12 R2-0 ' plus IF !0 GOTO @SKIP1 R0=R0+R1 GOTO @END @SKIP1 R2-1 ' minus IF !0 GOTO @SKIP2 R0=R0-R1 GOTO @END @SKIP2 R2-2 ' multi IF !0 GOTO @SKIP3 R0*=R1 GOTO @END @SKIP3 R2-3 ' division IF !0 GOTO @SKIP4 PUSH {R4} GOSUB R3 POP {R4} GOTO @END @SKIP4 R2-4 ' division(remain) IF !0 GOTO @SKIP5 PUSH {R4} GOSUB R3 POP {R4} R0=R1 ' GOTO @END @SKIP5 @END R4=R4>>6 R4&=R5 [R6+R4]L=R0 POP {LR,R4,R5,R6}

"32bit calc library on asm15-rc1"

マシン語呼び出しのパラメーターで、計算種類、配列位置で、結果格納、計算する数2つを指定します。32bit = 4byte なので、配列は[0]と[1]など、2つずつ使います。コンパイルした結果がこちら。

10 POKE#700,112,181,8,38,54,2,142,25,60,37,4,70,160,8,40,64,48,88,161,0,41,64,113,88,34,11,0,42,1,209,64,24,19,224,1,42,1,209,64,26 20 POKE#728,15,224,2,42,1,209,72,67,11,224,3,42,3,209,16,180,152,71,16,188,5,224,4,42,3,209,16,180,152,71,16,188,8,70,164,9,44,64,48,81 30 POKE#750,112,189 RUN

例えば、1234*5678 (=7006652)を計算するには、このように使います。

[0]=1234:[2]=5678 U=USR(#700,#2201):'[4]=[0]*[1] [6]=10000 ?DEC$(USR(#700,#3523),4)DEC$(USR(#700,#4423),4) 7006652

結果の表示上、9999万9999まで表示します。マイナスの数はどうなるか、やってみましょう! links
- IchigoJam
- マシン語でつくるプログラマブル学習リモコン
- レゴテクニックシリーズをIchigoJamと赤外線LEDで制御する(マシン語) / Control Lego Technic by IchigoJam and IR LED
- はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

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