|
发表于 2015-11-10 09:22:24
|
显示全部楼层
以前用51汇编做的编解码程序,好不容易找出来.参考一下
; 4进制RS变换编码,该码为非本元RS码.其最小距离d=2,纠错能力t=1的(3,1)码.
ORG 0000H
AJMP START
;信息码元
M0 EQU 40H
;编码码元
W0 EQU 41H
W1 EQU 42H
W2 EQU 43H
; n-1
;fi = Fj * a^-i*j
; j=0
ORG 002FH
START: MOV R5, #03H ;i,共循环n次
MOV R2, #00H ;BTAB的首地址
MOV R0, #W0 ;R0指向编好码元的首地址
MOV R1, #M0 ;R1指向信息码元的首地址
BM: MOV @R0, #00H ;(R0)<=00H
MOV A, R2
MOV DPTR, #BTAB
MOVC A, @A+DPTR ;读表BTAB
MOV B, A
MOV DPTR, #ATAB
MOV A, @R1
MOVC A, @A+DPTR ;求Mi的指数
ADD A, B
MOV DPTR, #ETAB
MOVC A, @A+DPTR ;求Fj * a^-i * j
MOV @R0, A
INC R2 ;指向表的下一个值
INC R0 ;指向下一个编好码元单元
DJNZ R5, BM
;(指数相乘表)
ETAB: DB 01H,02H,03H,00H
DB 02H,03H,01H,00H
DB 03H,02H,01H,00H
DB 00H,00H,00H,00H
;(数值找指数表)
ATAB: DB 03H,00H,01H,02H
;(编码指数表)
BTAB: DB 00H,04H,08H
END
; 4进制RS变换译码,该码为本元RS码.其最小距离d=3,纠错能力t=1的(3,1)码.
; 施俊毅 97年2月
ORG 0000H
AJMP START
;接收到的码元存放单元
G0 EQU 44H
G1 EQU 45H
G2 EQU 46H
;纠正子存放单元
S0 EQU 47H
S1 EQU 48H
S2 EQU 49H
;
Q1 EQU 4AH
;
E2 EQU 4BH
; n-1
;Sj= Fri*a^i*j
; i=0
ORG 002FH
START: MOV R4, #03H ;j
MOV R2, #00H ;置IJTAB表的首地址
MOV R0, #S0 ;R0指向纠正子的首地址
NEXTA: MOV R1, #G0 ;R1指向接收码元的首地址
MOV @R0, #00H ;预置(R0)<--0
MOV R3, #03H ;i
NEXT: MOV A, R2
MOV DPTR, #IJTAB
MOVC A, @A+DPTR ;读表IJTAB
MOV B, A ;B为ETAB的纵坐标
MOV A, @R1
MOV DPTR, #ATAB
MOVC A, @A+DPTR ;求Ri的指数
ADD A, B
MOV DPTR, #ETAB
MOVC A, @A+DPTR ;A<=Fi * a^i * j
XRL A, @R0
MOV @R0, A
INC R1
INC R2
DJNZ R3, NEXT
INC R0
DJNZ R4, NEXTA
;判断是否有错
;即R0=R1=00H时,该码元无错
MOV A, #00H
ADD A, S0
ADD A, S1
JNZ HAVER
AJMP OK
;求S1/S0
MOV DPTR, #ATAB
MOV A, S0
MOVC A, @A+DPTR ;求S0的指数
MOV B, A
MOV A, S1
MOVC A, @A+DPTR ;求S1的指数
CLR C
SUBB A, B ;S1-S0
MOV B, A
ANL A, #80H
JZ ZSA ;判断是否为负数
MOV A, B ;若为负数--->取反+1
XRL A, #0FFH
INC A
MOV B, A ;求该数的模
MOV A, #04H
CLR C
SUBB A, B
SJMP ZSB
ZSA: MOV A, B
ZSB: MOV R0, A ;R0为S1/S0的指数
;判断有一位错误,可根据递归方程组求出
;E2 = E1 * ○1
MOV A, R0 ;这时的R0为○1的指数
MOV B, #08H
MUL AB
MOV R2, A
;
MOV R1, #E2
;
MOV A, S1 ;E1
MOV DPTR, #ATAB
MOVC A, @A+DPTR ;求Ri的指数
ADD A, R2
MOV DPTR, #ETAB
MOVC A, @A+DPTR
MOV @R1, A
;纠正错误
MOV A, E2
XRL S2, A
OK: NOP
;(指数相乘表)
ETAB: DB 01H,02H,03H,00H
DB 02H,03H,01H,00H
DB 03H,02H,01H,00H
DB 00H,00H,00H,00H
;(数值找指数表)
ATAB: DB 03H,00H,01H,02H
;(I,J相乘表)
IJTAB: DB 00H,00H,00H,04H,08H,00H,08H,04H
DB 00H
END |
|