海明码汇编语言实现

海明码简介
海明码其性能是检测一位错,是在奇偶校验码的思想上发展起来的,它在K位数据位中加入r个校验位,形成一个K+r位的新码字,并且将数据的每个二进制位分配到几个不同的奇偶校验组中。这样,当其中一位发生变化时,会引起有关的几个组出现奇偶校验错。通过这些出错组的不同组合,就能够指明是哪一位出现了错误,从而进行纠错。
使用海明码进行校验,首先需要确定校验码的位数。在本实验中,海明码只要求实现一位检错纠错,此时r位校验位能够表示2的r次方种不同的状态。为了实现一位检错纠错,需要用一种状态表示信息正确,用k+r种状态表示K位数据位和r位校验位中的每一位出错,共k+r+1种状态,因此要求:

2的r次方>=k+r+1

本实验中,设数据位为D,共4位,记为D4…D1;校验位为P,共3位,记为P3…P1;编码所得的海明码为H,共7位,记为H7…H1,且位号1表示最低位。
海明码的编码规则是:
(1)每个校验位Pi在海明码H中被分配在位号2的i-1次方的位置,H中的空余位上放置数据位,并按从低向高的顺序逐位依次排列分配各数据位。
(2)海明码的每一位码Hi(包括数据位和校验位)由多个校验位校验,其关系是被校验的每一位的位号等于校验该位的各校验位的位号之和,这样安排的目的是希望校验的结果能正确反映出出错位的位号。

实现细节
①按位取出每一位:通过移位指令将需要取出的位移到最低位,通过AND Ri,01H指令取出保存到其它寄存器。
②在当前取出的位上,判断当前位计算哪个校验位与校验位寄存器异或运算。例如:当前取的是数据位第四位D4,而P1=D1⊕D2⊕D4,P2=D1⊕D3⊕D4,P3=D2⊕D3⊕D4,第四位在P1,P2,P3中均需运算,此时将D4位与保存P1,P2,P3的三个寄存器进行异或运算,便可实现取位运算操作。
③将三个校验位的值变为八位二进制数,输出结果即可。

下图是我的7位海明码的原理图,其中Pi指校验位,Hi指数据位

H7 H6 H5 H4 H3 H2 H1

D4 D3 D2 P3 D1 P2 P1
汇编代码

DATAS SEGMENT
    ARRAY DB 16 DUP(?)
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX

    MOV AX,0
    MOV BX,0

    MOV AH,1
    INT 21H
    SUB AL,'0'
    MOV ARRAY[BX],AL

    MOV AH,1
    INT 21H
    SUB AL,'0'
    MOV ARRAY[BX+1],AL

    MOV AH,1
    INT 21H
    SUB AL,'0'
    MOV ARRAY[BX+2],AL

    MOV AH,1
    INT 21H
    SUB AL,'0'
    MOV ARRAY[BX+3],AL

    MOV AH,1
    INT 21H
    SUB AL,'0'
    MOV ARRAY[BX+4],AL

    MOV AH,1
    INT 21H
    SUB AL,'0'
    MOV ARRAY[BX+5],AL

    MOV AH,1
    INT 21H
    SUB AL,'0'
    MOV ARRAY[BX+6],AL

    MOV DX,0
    MOV AX,0
    MOV DL,ARRAY[BX+3]
    ROL DL,1
    MOV AL,ARRAY[BX+5]
    ADD DL,AL
    ROL DL,1
    MOV AL,ARRAY[BX+6]
    ADD DL,AL
    MOV ARRAY[BX+7],DL

    MOV AX,0
    MOV DX,0
    MOV AL,ARRAY[BX+4]
    XOR AL,ARRAY[BX+2]
    XOR AL,ARRAY[BX]
    MOV ARRAY[BX+8],AL

    MOV AX,0
    MOV DX,0
    MOV AL,ARRAY[BX+4]
    XOR AL,ARRAY[BX+1]
    XOR AL,ARRAY[BX]
    MOV ARRAY[BX+9],AL

    MOV AX,0
    MOV DX,0
    MOV AL,ARRAY[BX]
    XOR AL,ARRAY[BX+1]
    XOR AL,ARRAY[BX+2]
    MOV ARRAY[BX+10],AL

    MOV AX,0
    MOV DX,0
    MOV AL,ARRAY[BX+10]
    ROL AL,1
    MOV DL,ARRAY[BX+9]
    ADD AL,DL
    ROL AL,1
    MOV DL,ARRAY[BX+8]
    ADD AL,DL;算出的结果

    MOV DL,ARRAY[BX+7]
    XOR DL,AL
    ADD DL,'0'
    MOV AH,2
    INT 21H



    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

实验结果
第一组数据的海明码:00010010
P1=D1⊕D2⊕D4=1
P2=D1⊕D3⊕D4=1
P3=D2⊕D3⊕D4=1
P3P2P1=(111)B=07H

第三组数据的海明码:001001000
理论值:P1=D1⊕D2⊕D4=1
P2=D1⊕D3⊕D4=1
P3=D2⊕D3⊕D4=0
P3P2P1=(011)B=03H

以上代码是未经优化的代码

本文章作为硬件实训报告的一部分

更多内容访问omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值