汇编语言奇偶校验位实现求助:已完成1计数,后续步骤卡壳
ARM汇编奇偶校验位实现方案
假设你已经完成了Bit0-Bit30的1的计数,结果存在r2寄存器,原数据存在r3寄存器,以下是后续生成奇偶校验字的完整步骤:
核心逻辑回顾
- 偶校验:整个字(Bit0-Bit31)中1的总数为偶数,校验位 = 原数据1的个数的奇偶值(偶数→0,奇数→1)
- 奇校验:整个字中1的总数为奇数,校验位 = 原数据1的个数的奇偶值取反(偶数→1,奇数→0)
汇编代码实现
; 1. 初始化内存中的数据(示例:0x55555555) .data orig_data: .word 0x55555555 .text .global main main: ; 加载原数据到r3 ldr r3, =orig_data ldr r3, [r3] ; --- 这里插入你已完成的1的计数代码,最终计数结果存入r2 --- ; 示例计数代码(供参考): mov r2, #0 mov r4, r3 count_loop: cmp r4, #0 beq count_done and r5, r4, #1 add r2, r2, r5 lsr r4, r4, #1 b count_loop count_done: ; --- 计数结束,r2为Bit0-Bit30中1的个数 --- ; 2. 生成偶校验字(存入r0) mov r0, r3 bic r0, r0, #0x80000000 ; 清除Bit31位 and r5, r2, #1 ; 提取计数的奇偶位(0=偶,1=奇) lsl r5, r5, #31 ; 把校验位移到Bit31位置 orr r0, r0, r5 ; 合并校验位,得到偶校验字 ; 3. 生成奇校验字(存入r1) mov r1, r3 bic r1, r1, #0x80000000 ; 清除Bit31位 eor r6, r5, #1 ; 偶校验位取反得到奇校验位 lsl r6, r6, #31 orr r1, r1, r6 ; 合并校验位,得到奇校验字 ; 程序结束(根据平台调整,比如ARM Linux用exit) mov r7, #1 swi #0
代码解释
bic r0, r0, #0x80000000:用位清除指令把原数据的Bit31置0,保留Bit0-Bit30的有效位and r5, r2, #1:提取计数的最低位,直接得到偶校验位(原计数为偶时最低位是0,对应校验位0;原计数为奇时最低位是1,对应校验位1)eor r6, r5, #1:对偶校验位取反,得到奇校验位lsl + orr:把校验位移动到Bit31位置,再和清零后的原数据合并,得到最终的奇偶校验字
示例验证
当原数据为0x55555555时,计数结果r2=16(偶数):
- 偶校验位为
0,最终r0=0x55555555 - 奇校验位为
1,最终r1=0xD5555555(0x55555555 | 0x80000000 = 0xD5555555)
内容的提问来源于stack exchange,提问作者Maverick Dasig
相关产品推荐
相关产品推荐

