?? hm16.asm
字號:
;16比特漢明碼測試程序(原始數據11字節,編碼結果為16字節)
; [16,11,4] 增廣漢明碼校驗矩陣: |
; D15 D14 D13 D12 D11 D10 D9 D7 D6 D5 D3 D16 D8 D4 D2 D1 校驗碼
; | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | C4=0FFFFH
; | 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 | C3=0FE08H
; | 1 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 | C2=0F1C4H
; | 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 | C1=0CDA2H
; | 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 1 | C0=0AB61H
SADD EQU 30H ;原始數據存放首址(11字節)
DADD EQU 40H ;編碼結果存放首址(16字節)
RADD EQU 50H ;解碼結果存放首址(11字節)
ERR BIT 00H ;出錯標志。
ORG 0000H
LJMP MAIN
ORG 100H
MAIN: MOV R0,#SADD ;生成11個原始數據
MOV R2,#11
MOV A,#05H
S1: MOV @R0,A
ADD A,#11H
INC R0
DJNZ R2,S1
LCALL HAMBM ;進行編碼
LCALL HAMJM ;進行解碼,完全正確
MOV R0,#DADD
MOV A,@R0
XRL A,#20H ;制造一個差錯
MOV @R0,A
LCALL HAMJM ;進行解碼,完全正確
MOV R0,#DADD
MOV A,@R0
XRL A,#04H ;再制造一個差錯
MOV @R0,A
LCALL HAMJM ;進行解碼,不能正確恢復
STOP: LJMP STOP ;
;編碼算法
HAMBM: MOV R1,#DADD
MOV R0,#SADD+8 ;后3個字節用來拆分
MOV A,@R0
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV R0,#SADD
HAMBM3: MOV A,@R0 ;取前8個字節中的一個字節(8比特)
MOV R3,A
MOV A,R7 ;從后3個字節中各移出1比特(共3比特)
RLC A
MOV R7,A
RRC A
MOV R4,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R4
RRC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RRC A
ANL A,#0E0H
MOV R4,A ;得到11比特信息位(R3和R4的高3位)。
ANL A,#61H ;求校驗位D1
MOV C,P
MOV A,R3
ANL A,#0ABH
JNB P,HAMBM4
CPL C
HAMBM4: MOV A,R4
MOV ACC.0,C
MOV R4,A ;拼裝進低字節
ANL A,#0A2H ;求校驗位D2
MOV C,P
MOV A,R3
ANL A,#0CDH
JNB P,HAMBM5
CPL C
HAMBM5: MOV A,R4
MOV ACC.1,C
MOV R4,A ;拼裝進低字節
ANL A,#0C4H ;求校驗位D4
MOV C,P
MOV A,R3
ANL A,#0F1H
JNB P,HAMBM6
CPL C
HAMBM6: MOV A,R4
MOV ACC.2,C
MOV R4,A ;拼裝進低字節
ANL A,#08H ;求校驗位D8
MOV C,P
MOV A,R3
ANL A,#0FEH
JNB P,HAMBM7
CPL C
HAMBM7: MOV A,R4
MOV ACC.3,C
MOV R4,A ;拼裝進低字節
MOV C,P ;求校驗位D16
MOV A,R3
JNB P,HAMBM8
CPL C
HAMBM8: MOV A,R4
MOV ACC.4,C
MOV R4,A ;拼裝進低字節
MOV A,R3 ;輸出兩字節編碼結果(R3R4)
MOV @R1,A
INC R1
MOV A,R4
MOV @R1,A
INC R1
INC R0
CJNE R0,#SADD+8,HAMBM3;共輸出16字節編碼結果
RET
;解碼算法:
HAMJM: CLR ERR ;出錯標志初始化。
MOV R1,#RADD
MOV R0,#DADD
MOV R2,#8 ;將16字節編碼分為8組進行解碼
HAMJM2: MOV A,@R0 ;每組2字節,裝入R3R4中
MOV R3,A
MOV C,P
INC R0
MOV A,@R0
MOV R4,A
INC R0
JNB P,HAMJM3
CPL C
HAMJM3: MOV F0,C ;將16比特的校驗結果裝入F0中。
MOV B,#0 ;初始化校驗碼
MOV A,R4 ;D1校驗
ANL A,#61H
MOV C,P
MOV A,R3
ANL A,#0ABH
JNB P,HAMJM4
CPL C
HAMJM4: MOV B.0,C ;拼裝D1
MOV A,R4 ;D2校驗
ANL A,#0A2H
MOV C,P
MOV A,R3
ANL A,#0CDH
JNB P,HAMJM5
CPL C
HAMJM5: MOV B.1,C ;拼裝D2
MOV A,R4 ;D4校驗
ANL A,#0C4H
MOV C,P
MOV A,R3
ANL A,#0F1H
JNB P,HAMJM6
CPL C
HAMJM6: MOV B.2,C ;拼裝D4
MOV A,R4 ;D8校驗
ANL A,#08H
MOV C,P
MOV A,R3
ANL A,#0FEH
JNB P,HAMJM7
CPL C
HAMJM7: MOV B.3,C ;拼裝D8
MOV A,B ;取三個校驗結果。
JZ HAMJMC ;漢明碼無差錯,信息有效。
JB F0,HAMJM8 ;差錯判斷。
SETB ERR ;發現兩個差錯,設立出錯標志。
HAMJM8: INC A
MOVC A,@A+PC ;一個差錯,查表得到糾錯位置碼。
SJMP HAMJM9
DB 01H,02H,20H,04H
DB 40H,80H,01H,08H
DB 02H,04H,08H,10H
DB 20H,40H,80H
HAMJM9: XCH A,B
INC A
MOVC A,@A+PC ;字節碼(0:低字節,1:高字節)
SJMP HAMJMA
DB 0,0,0,0,0,0,1,0
DB 1,1,1,1,1,1,1,0
HAMJMA: JNZ HAMJMB
MOV A,B
XRL A,R4 ;低字節糾錯處理。
MOV R4,A ;保存糾錯后的漢明碼。
SJMP HAMJMC
HAMJMB: MOV A,B
XRL A,R3 ;高字節糾錯處理。
MOV R3,A ;保存糾錯后的漢明碼。
HAMJMC: MOV A,R3 ;糾錯后,高字節全部為信息位
MOV @R1,A ;輸出解碼結果
INC R1
MOV A,R4 ;低字節只有3比特信息,將其分別拼裝保存
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R7
RLC A
MOV R7,A
DEC R2
MOV A,R2
JZ HAMJMD ;低字節只有3比特信息,將其分別拼裝保存
LJMP HAMJM2
HAMJMD: MOV A,R5 ;將拼裝出來的三個字節信息輸出。
MOV @R1,A
INC R1
MOV A,R6
MOV @R1,A
INC R1
MOV A,R7
MOV @R1,A
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -