* khabaのメモ
 -(by [[K]], 2007.02.09)
 
 *** 1から10までの和を求めるサンプル
 *** (1) 1から10までの和を求めるサンプル
 -ASKA/khabaでの記述
  void sum10(; UINT6 s == D0; D1)
  void sum10(; UINT6 s == D1; D0)
  {
      UINT4 i == D1;
      UINT4 i == D0;
      s = 0;
      for (i = 0; i <= 10; i++)
          s += i;
      return;
  }
 -関数宣言の引数について:;によって3つに分かれる。1つ目は普通の引数。2つ目は返値。3つ目は破壊レジスタ。D3-D5, A1-A2 のように書ける。
 -レジスタにはもれなく型がある。型のない(値に意味のない)レジスタはvoid型であるとする。「UINT4 D1;」はもとのD1の値が失われる。「(UINT4) D1;」とすると失われない。このとき変換可能ではない値が入っていたりしたらそれは致命的なエラーである(khaba例外)。
 ----
 -これをIA-32用ネイティブにすると多分こうなる(UINT4とUINT6がINT32_32になる場合)。
  struct STR_KHABA *str_khaba == SS:EBP;
  void sum10()
  {
      int i == ECX, s == str_khaba->D1;
      s = 0;
      for (i = 0; i <= 10; i++)
          s += i;
      return;
  }
 -IA-16ネイティブの場合はこんな感じ(UINT4とUINT6をINT16_16とした場合)。
  struct STR_KHABA *str_khaba == SS:BP;
  void sum10()
  {
      short i == CX, s == str_khaba->D1;
      s = 0;
      for (i = 0; i <= 10; i++)
          s += i;
      return;
  }
 -うう、ASKAの記述力がすごくて差がわかりにくいかも。
 -6809ネイティブの場合はこんな感じ(UINT4とUINT6をINT16とした場合)。
  struct STR_KHABA *str_khaba == U;
  void sum10()
  {
      short i == str_khaba->D0, s == str_khaba->D1;
      D = 0; s = D;
      D = 0; i = D; /* khabaはこのD=0を省略できるほど賢くはない */
      do {
          D = i; D += s; s = D;
          D = i; D++; i = D;
          D = i; /* khabaはこのD=iも省略できない */
      } while (D <= 10);
      return;
  }
 
 
 *** 1からnまでの和を求めるサンプル
  void sum_n(UINT n == D0; UINT D1 == s; )
  void sum_n(UINT n == D1; UINT D2 == s; D0)
  {
      UINT i == D0;
      s = 0;
      for (i = 0; i <= n; i++)
          s += i;
      return;
  }
 -この場合、UINTのビット数は下限も上限もない。ネイティブコード変換時に適当に変換される。まあ基本的に感知しないということになる。
 
 *** こめんと欄
 -このページは誰かに意見を求めるためではなく、自分の記憶の整理のためにあるので、こめんと欄はありません。

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