* 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