* junkなpage #0002
* junkなpage #0003
-(by [[K]], 2013.06.27)
** (0) はじめに
-[[jpag0002]]をさらに改造
** (1) SMEM0PPとLMEM0PP
-配列を使っていると、ある要素にアクセスした後で、その次の要素にアクセスしたくなることがよくあります。
-OSECPUではそれに配慮して、
 SMEM0(Rxx, typ, Pxx); LIMM(R3F, 1); PADD(Pxx, typ, Pxx, R3F);
-をひとまとめにした命令があります。それが SMEM0PP(Rxx, typ, Pxx); です。
-同様にLMEM0PPもあります。これを使って[[jpag0002]]のプログラムを書き直してみたいと思います。
-つぎにPADDIという命令を紹介したいと思います。PADDでは定数を足すことができず、一度適当なレジスタに代入する必要がありました(上記でもまさにそうしています)。しかしこれは面倒です。ということで、それを自動でやってくれるPADDIというのがあります。PADDIの定義は次のとおりです。
 #define PADDI(preg0, typ, preg1, imm)    LIMM(R3F, imm); PADD(preg0, typ, preg1, R3F)

-「エラトステネスのふるい」のアルゴリズムを使った素数表示プログラムです。
 #include "osecpu_ask.h"
 
 #define L_putDec    LOCAL(0)
 LOCALLABELS(1);
 
 #define putDec(i)   R30=i; CALL(L_putDec)
 
     // main
     do {
         int32s i:R00, j:R02;
         VoidPtr p:P01, ptmp:P02;
         junkApi_malloc(P01, T_UINT1, 1000); // p
         PADD(ptmp, T_UINT1, p, 2);
         R01 = 0;
         for (i = 2; i != 1000; i++) {
             SMEM0PP(R01, UINT1, ptmp);
         }
         R01 = 1;
         for (i = 2; i != 1000; i++) {
             j = i * 2;
             for (;;) {
                 if (j >= 1000) break;
                 PASMEM0(R01, T_UINT1, p, j);
                 j += i;
             }
         }
         PADD(ptmp, T_UINT1, p, 2);
         for (i = 2; i != 1000; i++) {
             LMEM0PP(R01, T_UINT1, ptmp);
             if (R01 == 0) {
                 putDec(i);
                 junkApi_putConstString(' ');
             }
         }
     }
 
 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();

* こめんと欄
#comment

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