MSM : 迴圈的使用

迴圈(Loop)通常用來實作 重複而規律 的程式行為,例如,計算 一個陣列 所有內容的總和,或是將 一個陣列 複製到 另一個陣列中!MSM 的迴圈語法如下:

       MOVW ARn,次數    ; 設定迴圈繞行次數,MOVW 只能設 常數[註1]
Begin:              ; 迴圈開頭標記
       …               ;
       <迴圈內程式碼>     ;  
       …               ;
    LOOP $Begin,ARn  ; ARn 減1後 不為0,則跳回 $Begin 執行 

 

由上面的語法看出,迴圈指令(LOOP)是寫在迴圈的尾端,並以 ARn(n=0~5)來指定 迴圈繞行 的次數.當程式由上方進入迴圈時,至少會執行"迴圈內程式碼"一次,等執行到 LOOP 指令時,才根據 ARn 的值決定迴圈是否結束,LOOP 指令的行為是:

  1. 將 ARn 內容減 1,再存回 ARn
  2. 如果 ARn 數值 不等於 0,則 跳回 $Begin 處執行
  3. 如果 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 次


 

 

 

發表迴響