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

间接寻址连续存储寄存器值的优化方法及奇偶数组分拣问题

51单片机数组奇偶分拣问题解决

问题核心

你遇到的问题是未在每次存储奇偶数值后递增对应数组的指针,导致所有符合条件的数据都被写入同一个地址,最终仅保留最后一个奇偶值。

修正实现思路

  1. 维护两个独立的16位指针,分别指向奇数数组(x:2000H)和偶数数组(x:3000H)的当前存储位置
  2. 每次判断数值奇偶后,将数据写入对应指针地址,立即递增该指针
  3. 循环处理输入数组的每个元素,直到计数为0

示例汇编代码

; 初始化寄存器
MOV R0, 20H       ; R0 = 数组长度(d:20H)
MOV R1, 30H       ; R1 = 输入数组起始地址(d:30H)
MOV DPTR, #2000H  ; DPTR = 奇数数组起始地址(x:2000H)
MOV R2, DPL       ; R2R3 保存奇数数组当前指针低8位/高8位
MOV R3, DPH
MOV DPTR, #3000H  ; DPTR = 偶数数组起始地址(x:3000H)
MOV R4, DPL       ; R4R5 保存偶数数组当前指针低8位/高8位
MOV R5, DPH

LOOP:
MOV A, @R1        ; 读取输入数组当前元素
JB ACC.0, STORE_ODD  ; 判断LSB:为1则是奇数,跳转存储

; 存储偶数
MOV DPL, R4
MOV DPH, R5
MOVX @DPTR, A     ; 写入偶数数组当前地址
INC DPTR          ; 偶数指针递增
MOV R4, DPL
MOV R5, DPH
JMP NEXT

STORE_ODD:
MOV DPL, R2
MOV DPH, R3
MOVX @DPTR, A     ; 写入奇数数组当前地址
INC DPTR          ; 奇数指针递增
MOV R2, DPL
MOV R3, DPH

NEXT:
INC R1            ; 输入数组指针递增
DJNZ R0, LOOP     ; 计数减1,不为0则继续循环

SJMP $            ; 程序结束

调试验证要点

  • 在Keil内存窗口输入:
    • d:20H写入数组长度(比如05表示5个元素)
    • d:30H开始写入测试数据(比如01,02,03,04,05)
  • 单步执行时,观察R2R3(奇数指针)和R4R5(偶数指针)的变化,确认每次存储后指针+1
  • 查看x:2000H和x:3000H起始的内存,验证数据是否按奇偶连续存储

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:35:20