You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言奇偶校验位实现求助:已完成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:03:33