* junkなpage #0001
-(by [[K]], 2013.06.24)
** (1) 配列(?)を使ったプログラム例
-「エラトステネスのふるい」のアルゴリズムを使った素数表示プログラムです。
 #include "osecpu_ask.h"
 
 // osecpu049に書き忘れたので自分で書く(すみません!).
 #define my_malloc(_p, typ, len)  R38=typ; R39=len;  DB(0x32,_p&0x3f,0x38,0x39)
 #define T_UINT1     0x0d
 
 #define L_putDec    LOCAL(0)
 LOCALLABELS(1);
 
 #define putDec(i)   R30=i; CALL(L_putDec)
 
     // main
     do {
         int32s i:R00, j:R02;
         my_malloc(P01, T_UINT1, 1000);
         R01 = 0;
         for (i = 2; i != 1000; i++) {
             PADD(P02, T_UINT1, P01, R00); // i
             SMEM(R01, T_UINT1, P02); DB(0);
             SMEM(R01, T_UINT1, P02, 0);
         }
         R01 = 1;
         for (i = 2; i != 1000; i++) {
             j = i * 2;
             for (;;) {
                 if (j >= 1000) break;
                 PADD(P02, T_UINT1, P01, R02); // j
                 SMEM(R01, T_UINT1, P02); DB(0);
                 SMEM(R01, T_UINT1, P02, 0);
                 j += i;
             }
         }
         for (i = 2; i != 1000; i++) {
             PADD(P02, T_UINT1, P01, R00); // i
             LMEM(R01, T_UINT1, P02); DB(0);
             LMEM(R01, T_UINT1, P02, 0);
             if (R01 == 0) {
                 putDec(i);
                 junkApi_putConstString(' ');
             }
         }
     }
     jnukApi_exit(0); // ver.0.50ではこんなものはいらない.
       // ver.0.49まではこれがないとそのまま下の関数へ入ってしまう!.
 
 beginFunc(L_putDec);
     do {
         int32s i:R00, flag:R01, j:R02, ii:R03;
         i = R30;
         flag = 0;
         if (i < 0) {
             junkApi_putConstString('-');
             i *= -1;
         }
         for (j = 1000000000; j >= 10; j /= 10) {
             ii = i / j;
             i %= j;
             if (!(flag == 0 & ii == 0)) {
                 flag = 1;
                 ii += '0';
                 junkApi_putchar(ii);
             }
         }
         i += '0';
         junkApi_putchar(i);
     }
 endFunc();

-[解説]

-my_malloc(P01, T_UINT1, 1000);
--1ビットの符号なし整数1000個分のメモリをシステムからもらってきて、P01に格納します。
--OSECPUでは1ビットの配列という、C言語ではなかなかできないようなことを平然とやってのけます!
--その他の型のIDについては以下の通りです。
 #define T_SINT8     0x02 // 8bitの符号付き, いわゆる signed char.
 #define T_UINT8     0x03
 #define T_SINT16    0x04 // 16bitの符号付き, いわゆる short.
 #define T_UINT16    0x05
 #define T_SINT32    0x06
 #define T_UINT32    0x07
 #define T_SINT4     0x08
 #define T_UINT4     0x09
 #define T_SINT2     0x0a
 #define T_UINT2     0x0b
 #define T_SINT1     0x0c // 代入できるのは0か-1のみ.
 #define T_UINT1     0x0d
 #define T_SINT12    0x0e
 #define T_UINT12    0x0f
 #define T_SINT20    0x10
 #define T_UINT20    0x11
 #define T_SINT24    0x12
 #define T_UINT24    0x13
 #define T_SINT28    0x14
 #define T_UINT28    0x15
-PADD(P02, T_UINT1, P01, R00);
--ポインタレジスタP01は、T_UINT1を指し示すポインタであることを明示して、R00を加えて、結果をP02に入れます。
--P02 = &P01[R00]; みたいな感じです。
--ちなみにこういうアセンブラチックな命令では、変数宣言しておいたiが使えません。泣けます。
-SMEM(R01, T_UINT1, P02); DB(0);
-SMEM(R01, T_UINT1, P02, 0);
--P02で指し示されるメモリにR01の値を書き込みます。
--こんなふうに型を毎回明示する必要があります。そしてmallocしたときと違う型を指定すると、エラーになって動作しないので注意してください。
--型を間違えるとだめなのは、PADDのときも同様です。
--後ろのDB(0);がすごく汚らしいですが、これを忘れると大変なことになりますので、いつも忘れずにつけておいてください。
-LMEM(R01, T_UINT1, P02); DB(0);
//--後ろのDB(0);がすごく汚らしいですが、これを忘れると大変なことになりますので、いつも忘れずにつけておいてください。
-LMEM(R01, T_UINT1, P02, 0);
--P02で指し示されるメモリにアクセスして、その値をR01に代入します。
--その他についてはSMEM()と同様です。

* こめんと欄
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS