| 46 | これらはループ処理とデータの読み込みに利用される。詳細は以下で説明する。 |
| 47 | |
| 48 | * ループについて。CALでのループの実現には、色々な方法があるが、ここでは"whileloop"文を利用する。これは、"whileloop"と"endloop"に挟まれた命令列を永久に実行するという命令文である。よって、無限ループを終わらせる処理を自前で書く必要がある。必要な部分だけを抜き出すと以下のようなCALプログラムがループのひな形となる: |
| 49 | {{{ |
| 50 | whileloop |
| 51 | ige r2.x, r4.x, r4.w |
| 52 | break_logicalnz r2.x |
| 53 | iadd r4.x, r4.x, r4.z |
| 54 | endloop |
| 55 | }}} |
| 56 | ここで、"r4.x"がループカウンタとして、"r4.w"をループの上限値として使っている。これはC言語で書くと以下のような処理に相当する: |
| 57 | {{{ |
| 58 | while(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"をインクリメントすることになる。 |