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
相关产品推荐
相关产品推荐

