MSM : 四則運算 指令

四則運算就是 加/減/乘/除 四種數學運算,指令命名規則如下圖: 指令尾碼 (W/L/F) 是根據 Op1 的型態來選擇

MSM 四則運算指令說明

由於每種運算 支援 三種數值型態,所以排列組合共12個指令,語法格式為:

  • 加法: ADDW/ADDL/ADDF   Op1
  • 減法: SUBW/SUBL/SUBF   Op1
  • 乘法: MULW/MULL/MULF   Op1
  • 除法: DIVW/DIVL/DIVF   Op1

Op1 表示指令操作的資料來源(請參考 MSM 語法格式),一共有:

  • 常數 :123(整數) 或 123.456(浮點數)
  • 變數 :@Var_Name[index]
  • 指標 :*ARn[index]
  • 暫存器:@XARn

四則運算指令運作的方式為:

ACC ⇐ ACC +-×÷ Op1

表示每次運算,是將 ACC 與 Op1 做運算,再將運算結果存回 ACC!運算時 ACC 與 Op1 的資料型態可以不同,運算後 ACC 的資料型態是什麼?請參考 ACC 暫存器說明.接著以實例說明:


範例1:計算圓面積
 ; 計算: AREA = Radius 2 × pi
 ; 其中   AREA,Radius 型態皆為 Dint;

 

 LACCL @Radius  ; ACC <= Radius    , ACC 的型態為Dint
 MULL  @Radius  ; ACC <= Radius2   , ACC 的型態不變
 MULF  3.14159  ; ACC <= Radius2×pi, ACC 的型態改為 Real48
 SACCL @AREA    ; AREA <= F2L(ACC) , ACC 的型態仍為 Real48,即使存出成整數,也不改變 ACC 型態


範例2:需要 暫存中間變數,可用 暫存器(XARn)儲存 
 ; 計算: VAR_Y = ( A + B )×21 + ( C – D )/2.75 ,
 ; 其中   VAR_Y,A,C 為 Dint; B,D 為 int 型態    

 

 LACCL @A      ; ACC <= A         , ACC 的型態為Dint
 ADDW  @B      ; ACC <= A + B     , ACC 的型態仍為Dint
 MULW  21      ; ACC <= (A+B) x 21, ACC 的型態仍為Dint
 SACCL XAR0    ; XAR0<= ACC       , Dint 可暫存至 XAR0 [註 1]

 LACCL @C      ; ACC <= @C         , ACC 的型態為Dint
 SUBW  @D      ; ACC <= ACC – @D   , ACC 的型態仍為Dint
 DIVF  2.75    ; ACC <= ACC / 2.75 , ACC 的型態改為 Real48
 ADDL  XAR0    ; ACC <= ACC + XAR0 , ACC 的型態仍為 Real48
 SACCL @VAR_Y  ; VAR_Y = F2L(ACC)  ,ACC 的型態仍為 Real48


[註 1] 若當時 ACC 型態為 Real48,就不能儲存到 XAR0,否則會喪失精度,此時可以自己宣告一個 Real48的區域變數(Local Var)來儲存


 

發表迴響