下面以芯海的CSU18M系列单片机的汇编为例,实现取模函数
;==================================================================
;取模运算
;输入:R_Math_A0:3 被模数
;输入:R_Math_C0:3 模数
;输出:R_Math_A0:3 计算结果
;==================================================================
F_Math_Modulo:
movfw R_Math_C0
iorwf R_Math_C1,W
iorwf R_Math_C2,W
iorwf R_Math_C3,W
btfss STATUS,Z ;判断是否模数为0
goto L_Math_ModuloLoop1 ;否
;是
clrf R_Math_A0
clrf R_Math_A1
clrf R_Math_A2
clrf R_Math_A3 ;返回结果清0
retlw 0 ;返回失败
L_Math_ModuloLoop1:
clrf R_Math_Temp
bcf STATUS,C
L_Math_ModuloLoop2:
incf R_Math_Temp,F
rlf R_Math_C0,F
rlf R_Math_C1,F
rlf R_Math_C2,F
rlf R_Math_C3,F
btfss STATUS,C
goto L_Math_ModuloLoop2
L_Math_ModuloLoop4:
rrf R_Math_C3,F
rrf R_Math_C2,F
rrf R_Math_C1,F
rrf R_Math_C0,F
movfw R_Math_C0
subwf R_Math_A0,W
movfw R_Math_C1
subwfc R_Math_A1,W
movfw R_Math_C2
subwfc R_Math_A2,W
movfw R_Math_C3
subwfc R_Math_A3,W
btfss STATUS,C
goto L_Math_ModuloLoop3
movwf R_Math_A3
movfw R_Math_C0
subwf R_Math_A0,F
movfw R_Math_C1
subwfc R_Math_A1,F
movfw R_Math_C2
subwfc R_Math_A2,F
L_Math_ModuloLoop3:
bcf STATUS,C
decfsz R_Math_Temp,F
goto L_Math_ModuloLoop4
retlw 1 ;返回成功
其它:
如果b是2的幂,a % b 可以简化为 a & (b - 1)。 a = 任意数 b = 2^0、2^1、2^2、2^n ....