REPEAT命令

PIC24FのREPEAT命令でバグ作ってしまった。リテラル指定した繰り返し回数が1つ多かったのだ。
この命令は、リテラル(即値)でもレジスタでも、指定ループ回数+1だけループする。
そのため直後のmov命令を3回繰り返すとき


repeat #3
mov w1, [w0++]
と書くと、4回繰り返されてしまう。
3回繰り返したいなら、以下のように1つ減らして記述する。

repeat #2
mov w1, [w0++]


以下余談。
このことは以下のことを意味する。

  • 指定回数を実際より1つ少なくする。
  • 必ず直後の命令を1回以上繰り返す(0なら直後の命令を実行しない、とはならない)。

前者はリテラル指定の場合、大した問題ではない(私のように失念するとバグになるけど)。レジスタ指定の場合だと、必要な繰り返し数をわざわざdecで1つ減らす必要があるので面倒だ。たまたま計算した結果、繰り返し数が1つ少なくなる、というのは希だ。
後者の方は、繰り返し数0の場合、別途REPEAT部分を飛ばす必要がある。
リテラル指定の場合、繰り返し数をシンボル定義して.ifディレクティブで判定しコード自体を削除可能だ。
繰り返し数がレジスタ指定の場合、汎用的な記述は以下のようになる。


; w2の値が繰り返し数(>=0)
dec w2, w2 ; dec済みなら不要
cp0 w2
bra n, next
repeat w2
mov w1, [w0++] ; 繰り返し対象命令
next: