一小段汇编程序,帮忙解释一下
;**************************************************************************************************[]
; function: N-次方差计算
;
; INPUT:
; ZH:ZL:= #R_SSP_ADC_CoorBuf_E0E2
; VarL:= NUMBER
; VarL,VarH,VAR2,VAR3
;**************************************************************************************************[]
Sub_calculation_Coording_3DEA:
CALL Sub_OpenStk_withXDate__11F2
;
WDR ;
LDD ZH, Y+$04 ;
LDD ZL, Y+$05 ;D ;AD_Buffer
MOVW dw4F:dw4E, ZH:ZL ;
; [ 信号曲线参数保存 ]
MOVW ZH:ZL, dw4F:dw4E ;Copy dw4F: to ZH:
PUSH ZL ;
PUSH ZH ;
LDI XH, HIGH(R_SSPLine_Buffer) ;Loads an 8 bit constant directly to register 16 to 31
LDI XL, LOW(R_SSPLine_Buffer) ;
CALL Sub_MOV_SMPADC_To_Coor_42E5 ;信号曲线参数D_SSPdata_num/D_zoom_dat 存储数据
POP ZH ;
POP ZL ;
; ---------------------------------
CLC ;
LDI XL, $01 ;直接赋值1
LDD XH, Y+$07 ;Y+$07地址数据送入XH
TST XH ;Test XH
BREQ _L_next_3E0F ;相等跳转 _L_next_3E0F
BRLT _L_next_3E0F ;如果小于0 _L_next_3E0F
//循环
_L_loop_3E0B: LSL XL ;位左偏移 高位送入C
DEC XH ;XH-1
TST XH ;Test XH a logical AND between XH and itself
BRNE _L_loop_3E0B ;bgt _L_loop_3E0B
; ---------------------------------
_L_next_3E0F: MOV dw48, XL ;
LDI ZH, HIGH(R_SSPLine_Buffer) ;
LDI ZL, LOW(R_SSPLine_Buffer) ;
MOVW dw4d:dw4C, ZH:ZL ;
MOV dw49, dw48 ;
; RAM_dw4A <== Fun_SUM{ @R_SSP_ADC_buffer_C307+.. for 2^^Stk }
CLR XH ;
CLR XL ;
MOVW dw4B:dw4A, XH:XL ;
_L_loop_3E1A: TST dw49 ;
BREQ _L_next_3E30 ;
MOVW ZH:ZL, dw4D:dw4C ;
CLR XH ;
LD XL, Z+ ;
MOVW dw4D:dw4C, ZH:ZL ;
MOVW ZH:ZL, dw4B:dw4A ;
ADD ZL, XL ;Fun_SUM
ADC ZH, XH ;
MOVW dw4B:dw4A, ZH:ZL ;
DEC dw49 ;
JMP _L_loop_3E1A ;
;----------------------------------------
_L_next_3E30: ; RAM_dw4E <== RAM_dw4E + RAM_dw48+1/2
;----------------------------------------
MOV XL, dw48 ;
LSR XL ;右移
CLR XH ;
MOVW ZH:ZL, dw4F:dw4E ;
ADD ZL, XL ;
ADC ZH, XH ;
MOVW dw4F:dw4E, ZH:ZL ;
;
CLR ZH ;
MOV ZL, dw48 ;
LDI XL, LOW(D_SSPdata_num/D_zoom_dat) ;
LDI XH, HIGH(D_SSPdata_num/D_zoom_dat) ;
SUB XL, ZL ;
SBC XH, ZH ;
MOVW dw47:dw46, XH:XL ;
_L_loop_3E44: ; number
TST dw46 ;
BRNE _L_0701_0514 ;
TST dw47 ;
BRNE _L_0701_0514 ;
JMP _L_exit_3E91 ;//退出
_L_0701_0514:
CLR ZH ;
MOV ZL, dw48 ;
MOVW XL, dw4A ;
CALL SUB_HC_IDIV ; X/Z == {Fun_SUM{@R_SSP_ADC_buffer_C307+.. for 2^^Stk}} / 2^^Stk
MOVW XH:XL, ZL ; X/Z =>Z, r=>X
MOVW ZH:ZL, dw4E ;
ST Z+, XL ;
MOVW dw4E, ZL ;
;
MOVW ZH:ZL, dw4D:dw4C ;
CLR XH ;
MOV XL, dw48 ;
SUB ZL, XL ;
SBC ZH, XH ;
LD XL, Z ;
CLR XH ;
MOVW ZH:ZL, dw4B:dw4A ;
SUB ZL, XL ;
SBC ZH, XH ;
MOVW dw4B:dw4A, ZH:ZL ;
MOVW ZH:ZL, dw4D:dw4C ;
CLR XH ;
LD XL, Z+ ;
ADD dw4A, XL ;
ADC dw4B, XH ;
MOVW dw4D:dw4C, ZH:ZL ;
;
MOVW XH:XL, dw47:dw46 ;
SBIW XH:XL, 1 ;
MOVW dw47:dw46, XH:XL ;
JMP _L_loop_3E44
;---------------------------------------
_L_exit_3E91: MOVW ZH:ZL, dw4F:dw4E ;
SBIW ZH:ZL, 1 ;
LDD XL, Z+$00 ;
STS R_temp_C306, XL ;
;
MOVW XH:XL, dw49:dw48 ;
LSR XL ;
MOV dw49, XL ;
_L_loop_3E9E:
TST dw49 ;
BREQ _L_end_3EB2 ;
MOVW ZH:ZL, dw4F:dw4E ;
ADIW ZH:ZL, 1 ;
MOVW dw4F:dw4E, ZH:ZL ;
SBIW ZH:ZL, 1
LDS XL, R_temp_C306 ;
STD Z+$00, XL ;
DEC dw49 ;
JMP _L_loop_3E9E ;
_L_end_3EB2: CALL Sub_CloseStk_withXDate__1232