迴圈(Loop)通常用來實作 重複而規律 的程式行為,例如,計算 一個陣列 所有內容的總和,或是將 一個陣列 複製到 另一個陣列中!MSM 的迴圈語法如下:
MOVW ARn,次數 ; 設定迴圈繞行次數,MOVW 只能設 常數[註1]
Begin: ; 迴圈開頭標記
… ;
<迴圈內程式碼> ;
… ;
LOOP $Begin,ARn ; ARn 減1後 不為0,則跳回 $Begin 執行
由上面的語法看出,迴圈指令(LOOP)是寫在迴圈的尾端,並以 ARn(n=0~5)來指定 迴圈繞行 的次數.當程式由上方進入迴圈時,至少會執行"迴圈內程式碼"一次,等執行到 LOOP 指令時,才根據 ARn 的值決定迴圈是否結束,LOOP 指令的行為是:
- 將 ARn 內容減 1,再存回 ARn
- 如果 ARn 數值 不等於 0,則 跳回 $Begin 處執行
- 如果 ARn 數值 等於 0,則 離開迴圈,執行 LOOP 的下一行指令
[註 1] 如果迴圈執行的次數不是常數,而是一個變數,可利用下述方法給 ARn 值:
LACCW @Loop_cnt ; Loop_cnt = 迴圈次數
SALW @ARn ; 透過 AL 轉存到 ARn , n=0~5
如果 ARn 設定為 5,迴圈總共會繞 5 次,每次繞行時,ARn 的值為:
迴圈繞行次數 | ARn 的值 |
第1次 | 5 |
第2次 | 4 |
第3次 | 3 |
第4次 | 2 |
第5次 | 1 |
離開迴圈時 | 0 |
由此可知 在迴圈內,ARn 的值為 5,4,3,2,1 遞減.如果想在迴圈內參考某一陣列,用 ARn 當作 陣列的 索引 是不方便的,因為陣列的索引值都是由0開始,不是由1.所以必須使用另一暫存器 ARm(m ≠ n) 來當作 陣列的索引,接著 直接用範例來說明:
範例1,計算 Val = N! = N ×(N-1)×(N-2)× … × 1
LACCW @N ; 迴圈繞行次數 = N
SALW @AR1 ; 設定給 AR1
LACCW 1 ; 乘積初值 = 1
Begin: ; 迴圈開頭
MULW @AR1 ; 連續乘積:N × N-1 …
LOOP $Begin,AR1 ; 共 N 次
SACCL @Val ; 儲存結果 Val = N!
範例2,將 DINT:陣列 A 內容 複製到 DINT:陣列 B,長度為 8
MOVW @AR0,8 ; 設定迴圈繞行次數 = 8
MOVW @AR1,0 ; 陣列索引 初值 = 0
Start:
LACCL @A[AR1] ;
SACCL @B[AR1] ; B[AR1] <= A[AR1]
REG_ADDW AR1,1 ; 陣列索引 +1
LOOP $Start,AR0 ; 共執行 8 次