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

LC3汇编奇偶校验异常:求和所有数而非仅奇数问题排查

LC3汇编程序求和奇数的错误分析与修正

问题根源

你的代码中R2寄存器仅在初始化阶段加载了x3200地址的内容,后续循环过程中从未更新R2的值。这导致每次奇偶校验判断的都是x3200地址的数值,而非当前遍历的R3指向地址的数值:如果x3200地址的数是奇数,整个循环会累加所有数;如果是偶数,则所有数都不会被累加,完全不符合需求。

修正方案

有两种简洁的修正方式:

方式一:循环内实时更新R2的值

在每次循环开头,用LDR指令将当前R3指向地址的内容加载到R2中,确保校验的是当前遍历的数值:

.ORIG x3000

    ; initialize registers
    LD R0, HEX_ZERO
    LD R1, HEX_FF
    LD R3, HEX_START ; address of content
    LD R4, HEX_ONE   ; mask for checking oddness

    ; loop through hex values and sum odd numbers
    LOOP    
            ; 加载当前地址的内容到R2(新增此行)
            LDR R2, R3, #0
            ; check if value at current address is odd
            AND R5, R2, R4
            BRz SKIP
            ; add value at current address to sum
            LDR R6, R3, #0
            ADD R0, R0, R6
        SKIP    
            ; increment array address
            ADD R3, R3, #1

            ; decrement loop counter
            ADD R1, R1, #-1
            BRp LOOP

    ; store sum at x3300
    STI R0, HEX_STORE

    ; halt program
    HALT

HEX_START   .FILL x3200    ; memory location of first hex value
HEX_STORE   .FILL x3300    ; memory location to store sum
HEX_FF      .FILL #256     ; loop counter value
HEX_ONE     .FILL #1       ; mask for checking oddness
HEX_ZERO    .FILL #0       ; sum initial value

.END

方式二:省略R2,直接校验当前地址值

可以去掉R2寄存器,直接用LDR读取当前值到R5做AND操作,简化代码结构:

.ORIG x3000

    ; initialize registers
    LD R0, HEX_ZERO
    LD R1, HEX_FF
    LD R3, HEX_START ; address of content
    LD R4, HEX_ONE   ; mask for checking oddness

    ; loop through hex values and sum odd numbers
    LOOP    
            ; 直接读取当前地址值与掩码做AND
            LDR R5, R3, #0
            AND R5, R5, R4
            BRz SKIP
            ; add value at current address to sum
            LDR R6, R3, #0
            ADD R0, R0, R6
        SKIP    
            ; increment array address
            ADD R3, R3, #1

            ; decrement loop counter
            ADD R1, R1, #-1
            BRp LOOP

    ; store sum at x3300
    STI R0, HEX_STORE

    ; halt program
    HALT

HEX_START   .FILL x3200    ; memory location of first hex value
HEX_STORE   .FILL x3300    ; memory location to store sum
HEX_FF      .FILL #256     ; loop counter value
HEX_ONE     .FILL #1       ; mask for checking oddness
HEX_ZERO    .FILL #0       ; sum initial value

.END

补充说明

  • 你原本的奇偶校验逻辑是正确的:用数值和#1做AND操作,结果为0则是偶数,非0则是奇数。
  • 循环计数器HEX_FF设为#256是正确的,因为x3200到x32FF共包含256个地址。

内容的提问来源于stack exchange,提问作者Kiyst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:08