📄 funcs.asm
字号:
.def _ImageSub
.def _PixStat
.def _PixLineFilter
.def _SquareX
.def _MutualityH
.def _GetInitSqrt
;===============================================================================
; 子程序名: ImageSub
; 功能: 做差分图
; 输入接口: A4,B4为两幅做差分的源图地址, A6为差分图的地址,B6为图像字节数
; A8为二值化的阈值
;===============================================================================
_ImageSub:
STW A0, *--B15
STW A1, *--B15
STW A2, *--B15
STW A7, *--B15
STW A8, *--B15
STW A9, *--B15
STW A10, *--B15
STW A11, *--B15
STW B0, *--B15
STW B1, *--B15
STW B2, *--B15
STW B7, *--B15
STW B8, *--B15
STW B9, *--B15
STW B10, *--B15
STW B11, *--B15
MV B6, A1
LDW .D1 *A4++, A7
|| LDW .D2 *B4++, B7
NOP 4
MVK .S1 0FFH, A0
MV A8, B2
AND .L2X B2, A0, B2 ;阈值
SHR A1, 2, A1
MVK .S2 0, B0
|| MVK .S1 89,A2
LPSub:
MVK .S1 0FFH, A0 ; in A2 are mask value
|| MV .L1 A7, A8
|| MV .L2 B7, B8
[!B0] MV .L2X A8, B8
|| [!A2] MV .L1X B8, A8
|| [!A2] MVK .S1 90, A2
|| [!A2] MVK .S2 0, B0
LDW .D1 *A4++, A7
|| LDW .D2 *B4++, B7
|| AND .L1 A8, A0, A10 ;byte 0
|| AND .L2X B8, A0, B10
|| SHRU .S1 A8, 8, A9
|| SHRU .S2 B8, 8, B9
AND .L1 A9, A0, A11 ;byte1
|| AND .L2X B9, A0, B11
|| SHRU .S1 A9, 8, A8
|| SHRU .S2 B9, 8, B8
SUB .L1X A10, B10, A10
|| SUB .L2X B11, A11, B11
ABS .L2 B11, B10
|| ABS .L1 A10, A10
CMPGTU .L1X A10, B2, A10
|| CMPGTU .L2 B10, B2, B10
MPY .M1 A10, A0, A10
|| MPY .M2X B10, A0, B10 ;A10、B10在一个时隙后可以拼接
AND .L1 A8, A0, A11 ;byte2
|| AND .L2X B8, A0, B11
|| SHRU .S1 A8, 8, A9
|| SHRU .S2 B8, 8, B9
SUB .L2X B11, A11, B11
|| SHL .S2 B10, 8, B10
ABS .L2 B11, B11 ;B11中的减法结果等待二值化、移位再填充到A10
|| OR .L1X A10, B10, A10
SUB .L1X A9, B9, A11 ;BYTE 3
ABS .L1 A11, A11
|| CMPGTU .L2 B11, B2, B11
CMPGTU .L1X A11, B2, A11
|| MPY .M2X B11, A0, B11
|| SUB .S1 A1, 1, A1
[A1] B .S2 LPSub
MPY .M1 A11, A0, A11
|| ADD .L2 B0, 1, B0
|| SUB .L1 A2, 1, A2
SHL .S2 B11, 16, B11
OR .L1X A10, B11, A10
|| SHL .S1 A11, 24, A11
OR .L1 A10, A11, A10
STW .D1 A10, *A6++
LDW *B15++, B11
LDW *B15++, B10
LDW *B15++, B9
LDW *B15++, B8
LDW *B15++, B7
LDW *B15++, B2
LDW *B15++, B1
LDW *B15++, B0
LDW *B15++, A11
LDW *B15++, A10
LDW *B15++, A9
LDW *B15++, A8
LDW *B15++, A7
LDW *B15++, A2
LDW *B15++, A1
LDW *B15++, A0
B B3
NOP 5
;===============================================================================
; 子程序名: PixStat
; 功 能: 统计差分图的横、纵亮度分布,统计结果存放在pHori, pVert两个向量中
; 输入参数: A4--图像首地址, B4--起始行数, A6--需统计行数
; B6--pHori A8---pVert B8---需统计的列数/4
;===============================================================================
* A1 -- Heightn A4 -- pAddr A5 -- pHori B5 -- pVert
_PixStat:
STW A0, *--B15
STW A1, *--B15
STW A4, *--B15
STW A5, *--B15
STW A6, *--B15
STW A7, *--B15
STW A8, *--B15
STW A9, *--B15
STW B1, *--B15
STW B5, *--B15
STW B6, *--B15
STW B8, *--B15
STW B9, *--B15
MV .L2 B8, B9
MV .L2 B6, B8
MVK .S1 0xFF, A0
SHL .S2 B4, 2, B4
ADD .L2 A8, B4, B5
MV .L1 A6, A1
|| SUB .S2 B5, 4, B5
LoopHi:
MV .L1X B8, A5 ;A5---pHori
|| MV .L2 B9, B1
|| ADD .D2 B5, 4, B5 ;B5---pVert
LoopVi:
LDW .D1 *A4++, A6
|| LDW .D2 *B5, B6
NOP 4
LDW .D1 *A5, A9 ;A9 = *pHori
AND .L1 A6, A0, A7 ;A7---Byte0
ADD .S2X B6, A7, B6 ;B6 += Byte0
NOP 2
ADD .D1 A9, A7, A9
STW .D1 A9, *A5++ ;
LDW .D1 *A5, A9
SHR .S1 A6, 8, A7
AND .L1 A7, A0, A7 ;A7---Byte1
ADD .S2X B6, A7, B6 ;B6 += Byte1
NOP
ADD .D1 A9, A7, A9
STW .D1 A9, *A5++
LDW .D1 *A5, A9
SHR .S1 A6, 16, A7
AND .L1 A7, A0, A7 ;A7---Byte2
ADD .S2X B6, A7, B6 ;B6 += Byte2
NOP
ADD .D1 A9, A7, A9
STW .D1 A9, *A5++
LDW .D1 *A5, A9
SHR .S1 A6, 24, A6
AND .L1 A7, A0, A7 ;A7---Byte3
ADD .S2X B6, A7, B6 ;B6 += Byte3
NOP
ADD .D1 A9, A7, A9
STW .D1 A9, *A5++
|| STW .D2 B6, *B5
|| SUB .L2 B1, 1, B1
[B1] B LoopVi
NOP 5
SUB .L1 A1, 1, A1
[A1] B LoopHi
NOP 5
LDW *B15++, B9
LDW *B15++, B8
LDW *B15++, B6
LDW *B15++, B5
LDW *B15++, B1
LDW *B15++, A9
LDW *B15++, A8
LDW *B15++, A7
LDW *B15++, A6
LDW *B15++, A5
LDW *B15++, A4
LDW *B15++, A1
LDW *B15++, A0
B B3
NOP 5
;=============================================================
;子程序名: PixLineFilter
;功 能: 将二值化的差分图滤波
;输入参数: 要处理的行首地址,处理结果存放的首地址
;=============================================================
_PixLineFilter:
STW A0, *--B15
STW A1, *--B15
STW A2, *--B15
STW A5, *--B15
STW A6, *--B15
STW A7, *--B15
STW A9, *--B15
STW A10, *--B15
STW A11, *--B15
STW A12, *--B15
STW A13, *--B15
STW B0, *--B15
STW B1, *--B15
STW B2, *--B15
STW B5, *--B15
STW B6, *--B15
STW B7, *--B15
STW B8, *--B15
STW B9, *--B15
STW B10, *--B15
STW B11, *--B15
STW B12, *--B15
STW B13, *--B15
MVK .S1 88, A1
MVK .S1 0x3fc, A7 ; 0X3Fc = 5*0xFF
|| MVK .S2 0, B8
MVK .S1 90, A2
MVK .S1 0xFF, A0
|| MVK .S2 0xFF, B0
MV .L2X A4, B1
|| MVK .S2 90, B2
|| LDW .D1 *A4, A5 ;本行四点----A5
LDW .D2 *+B1[B2],B5 ;下行四点----B5
NOP 4
LDW .D2 *-B1[B2],B6 ;上行四点----B6
NOP 2
ADD .L1 A4, 4, A4 ;!!! A4+1 --> +4
AND .L1 A5, A0, A10
|| AND .L2 B5, B0, B10
|| SHRU .S1 A5, 8, A9
|| SHRU .S2 B5, 8, B9
ADD .L2X B10, A10, B10
|| AND .S2 B6, B0, B2
SHRU .S2 B6, 8, B6
|| ADD .L2 B10, B2, B10 ;左第一列累加 -> B10
AND .L1 A9, A0, A11
|| AND .L2 B9, B0, B11
|| SHRU .S1 A9, 8, A5
|| SHRU .S2 B9, 8, B5
ADD .L2X B11, A11, B11
|| AND .S2 B6, B0, B2
SHRU .S2 B6, 8, B6
|| ADD .L2 B11, B2, B11 ;左第二列累加 -> B11
AND .L1 A5, A0, A12
|| AND .L2 B5, B0, B12
|| SHRU .S1 A5, 8, A9
|| SHRU .S2 B5, 8, B9
ADD .L2X B12, A12, B12
|| AND .S2 B6, B0, B2
SHRU .S2 B6, 8, B6
|| ADD .L2 B12, B2, B12 ;左第三列累加 -> B12
AND .L1 A9, A0, A13
|| AND .L2 B9, B0, B13
|| AND .S2 B6, B0, B2
ADD .L2X B13, A13, B13
ADD .L2 B13, B2, B13 ;左第四列累加 -> B13
ADD .L2 B8, B10, B8
ADD .S2 B8, B11, B8 ; B8 = 0+1
|| ADD .L2 B10, B11, B10
CMPGTU .L2X B8, A7, B8
|| ADD .S2 B10, B12, B10 ; B10 = 0+1+2
CMPGTU .L2X B10, A7, B10
|| MPY .M2 B8, B0, B8
ADD .L2 B11, B12, B11
MPY .M2 B10, B0, B10
STB .D2 B8, *B4++
|| ADD .S2 B11, B13, B11 ; B11 = 1+2+3
STB .D2 B10, *B4++
|| CMPGTU .L2X B11, A7, B11
MPY .M2 B11, B0, B11
MV .L2 B12, B7
STB .D2 B11, *B4++
|| MV .S2 B13, B8 ; B7 B8 --- 前两列累加值
NextPixW:
MV .L2X A4, B1
|| MVK .S2 90, B2
|| LDW .D1 *A4, A5
LDW .D2 *+B1[B2],B5
NOP 4
LDW .D2 *-B1[B2],B6
NOP 2
ADD .L1 A4, 4, A4 ;!!! A4+1 --> +4
AND .L1 A5, A0, A10
|| AND .L2 B5, B0, B10
|| SHRU .S1 A5, 8, A9
|| SHRU .S2 B5, 8, B9
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -