间接寻址连续存储寄存器值的优化方法及奇偶数组分拣问题
51单片机数组奇偶分拣问题解决
问题核心
你遇到的问题是未在每次存储奇偶数值后递增对应数组的指针,导致所有符合条件的数据都被写入同一个地址,最终仅保留最后一个奇偶值。
修正实现思路
- 维护两个独立的16位指针,分别指向奇数数组(
x:2000H)和偶数数组(x:3000H)的当前存储位置 - 每次判断数值奇偶后,将数据写入对应指针地址,立即递增该指针
- 循环处理输入数组的每个元素,直到计数为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
相关产品推荐
相关产品推荐

