四則運算就是 加/減/乘/除 四種數學運算,指令命名規則如下圖: 指令尾碼 (W/L/F) 是根據 Op1 的型態來選擇!
由於每種運算 支援 三種數值型態,所以排列組合共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)來儲存.