Changes between Version 6 and Version 7 of CALプログラミング(3)


Ignore:
Timestamp:
Mar 22, 2009 3:25:57 AM (16 years ago)
Author:
nakasato
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CALプログラミング(3)

    v6 v7  
    4444||l1.z   ||ループカウンタのインクリメント用|| 
    4545 
     46 これらはループ処理とデータの読み込みに利用される。詳細は以下で説明する。 
     47 
     48 * ループについて。CALでのループの実現には、色々な方法があるが、ここでは"whileloop"文を利用する。これは、"whileloop"と"endloop"に挟まれた命令列を永久に実行するという命令文である。よって、無限ループを終わらせる処理を自前で書く必要がある。必要な部分だけを抜き出すと以下のようなCALプログラムがループのひな形となる: 
     49{{{ 
     50whileloop 
     51  ige r2.x, r4.x, r4.w 
     52  break_logicalnz r2.x 
     53  iadd r4.x, r4.x, r4.z 
     54endloop 
     55}}} 
     56 ここで、"r4.x"がループカウンタとして、"r4.w"をループの上限値として使っている。これはC言語で書くと以下のような処理に相当する: 
     57{{{ 
     58while(1) { 
     59  if (r4.x >= r4.w) break; 
     60  r4.x = r4.x + 1; 
     61} 
     62}}} 
     63 
     64 *  "ige"の行は、"r4.x"と"r4.w"の大小を比較して、"r4.x >= r4.w"が成り立っているならば、"r2.x"にTRUEがセットされる(詳しくはil.pdfの43ページを参照のこと。以下同様)。 
     65 
     66 * "break_logicalnz r2.x"は、"r2.x"が0でないならば、今のループを終了する。TRUEは0ではないので、"ige"でTRUEがセットされていたら、このループが終了する。この2命令を合わせて、C言語のほうのif文に相当することになる。 
     67 
     68 * "iadd"は、単純に整数の加算である。"r4.z"は"1"として初期化されているので、"r4.x"をインクリメントすることになる。