1.现象描述
51单片机开发过程中发现,程序总是概率性出现异常。经调试发现,“movx A, @Rx”指令读到内容与实际内存内容不一致,从而导致跳转逻辑错误。代码如下:
MOV R1, #00H
MOVX A, @R1
JNZ LABEL
这段代码读取外部内存地址为0x00的内容到累加器A,如果内容非零,则跳转到“LABEL”运行。调试发现MOVX指令执行之后,累加器A的值为0(实际XRAM地址为0的区域非零)。
2.解决
上网检索之后,发现有类似描述“外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用”。但是没有具体的原因分析。
最终将“MOVX A, @Rx”替换为“MOVX A, @DPTR”解决。代码如下:
MOV DPH, #00H
MOV DPL, #00H
MOVX A, @DPTR
JNZ LABEL