RSS

 

RSS


プ:ECO#3 一旦シミュレータ

  • いわいまさか
  • at 2011/11/26 11:56:36

ECOはエセコンパイラ。
コンパイラ軽~く作れるならそれでもいいけど、それはちょっと難しい。
それに似たことをテイよくやる。

例えばこんな話。

処理内容が

※Cソース
(それ以前にaやbには値が入っている)
 a += b   // aにbを足しこむ
 if(a>=256){  // aの範囲は0~255なのでクリッピング
  a=255;
 }
 if(a<0){
      a=0;
  }      

そのCPUには足した後256以上だったら255にしてくれる命令adds がある。飽和演算とよばれているやつ。

それをつかえば※の処理は1行で書けるのだ。
adds  areg  breg

が、ただ※のCソースを普通にコンパイルしたのでは
adds areg breg のコードは吐いてくれない。

//////////////////

さて、どうしようか?
ECOでの対処法の典型例を書く。

//////////////////
大筋
1.一旦シミュレータを作る
2.そのソースがそのまま使えるソースジェネレータを書く

//////////////////

1.一旦シミュレータを作る。

0~255の値をとる変数クラスを作り
関数 += を実装する。

class Reg8
{
    const  char *m_name;
     int m_value;

  Reg8(const char *name)
 {
    m_name=name; 
 }

  operator += (Reg8 b)
 {
     m_value+=b.m_value;
   if(m_value>=256){  // aの範囲は0~255なのでクリッピング
   m_value=255;
   }
  if(m_value<0){
      m_value=0;
   }
  }      
};

///
すると※の処理はC++のソースで

Reg8 areg("areg");
Reg8 breg("breg");
(ここになんらかのareg,bregを設定する処理)
areg+=breg;

と書ける。

実際にとして動かしてみれば、
void main()
{
    Reg8 areg("areg");
    Reg8 breg("breg");
 
   areg.m_value=200
   breg.m_value=70
   areg+=breg;
}

レジスタの動きがシミュレートできて。
計算が終わるとareg.m_valueに255が入ることが確かめられる。

つづく


  • コメント (0)
  • トラックバック (0)
トラックバックURL :
http://www.iwai-masaka.jp/tb.cgi/55513