next up previous contents
: 動作確認 : マイコンプログラム : 比較のプログラム   目次

条件分岐のプログラム

条件分岐は、実際は比較とジャンプの組み合わせで行われる。比較は7.9にて示したので、ここではジャンプについて述べる。jump()関数は、第一引数に比較演算子をとり、第二引数に条件が偽であるときにジャンプする命令数をとる関数である。7.9のプログラム中の_compareFlagと第一引数ncoとの論理積をとり、真であればジャンプしない。論理積をとるため、ncoが0であれば無条件でジャンプする。また、ncoに$=$$!=$を同時に満たすなど論理的に矛盾した値が代入されている時もやはり無条件ジャンプのような動作になる。
// nco: 比較演算子(numerical comparision operator)
// numJump: 偽の時ジャンプする命令数
void jump(byte nco, byte numJump)
{
    if (nco & _compareFlag)     // 真
        return;

    _currentAddr += numJump;    // 偽:現在実行中のアドレスをnumJump進める
}
_currentAddrはページアドレスを1bit左シフトした2byte変数であり、その1bit目が0か1かで1ページ内の上位と下位のコマンドを読み分けている。よって単純に数値を加算すると加算した数の命令をジャンプさせることができる。ただし、Terminatorを超えるジャンプをした場合その後の動作は未定義である。基本的にはFlashメモリの最下部まで読み取るかTerminatorまたはReturnを読み取るまでは停止しない。その間にあるコマンドは全て実行されてしまうため、ジャンプする命令数の設定には注意が必要である。



Deguchi Lab. 平成20年3月5日