
8051 架构最容易卡的点:不同存储器是互相独立的地址空间,地址编号可以重复,靠指令区分访问哪一块,不是像 ARM 那样单一地址总线。
汇编指令决定走哪条总线,地址数字重复完全没关系,硬件上分开。 举例子: 8bit 地址
0x10和 16bit 地址0x0010,不是同一个地方。
2. EEPROM 00H~7FH 和 data RAM 00H~7FH 重叠?
EEPROM 根本不走 MOV/MOVX 总线! 它不属于 RAM 地址空间,是独立的 IAP 存储域。 想要读 EEPROM,是写特定 SFR 寄存器、触发 IAP 操作,MOV 指令永远访问不到 EEPROM。 所以它的 00~7FH 只是 EEPROM 自己内部的编号,和 RAM 地址无关。
极简对照表
表格
| 存储区域 | 地址范围 | 访问指令 / 方式 | C51 修饰符 | 空间类型 |
|---|---|---|---|---|
| data RAM | 00H~7FH | MOV direct | data |
片内快速 RAM |
| idata RAM | 00H~0FFH | MOV @R0/@R1 | idata |
片内 RAM |
| XRAM(图标注:外部 RAM) | 0000H~02FFH | MOVX @DPTR | xdata |
片上 XRAM(768 字节) |
| EEPROM | 00H~7FH | IAP 寄存器读写 | 无,不能直接指针访问 | 非易失存储,掉电保存参数 |
| Program Flash | 0000H~3FFFH | MOVC | code |
程序代码区 |
一句话比喻
MOV 是1 号通道 ,房间号 00~FF
MOVX 是2 号通道 ,房间号 0000~02FF
IAP 是3 号独立通道 ,房间号 00~7FH 通道完全分开,就算房间编号一样,也不是同一个房间。
工程上最容易踩的坑
❌ 错误想法:(unsigned char xdata *)0x00 读 EEPROM ✅ 真相:这个写法走 MOVX,读到的是XRAM 的 0x0000 地址,不是 EEPROM! EEPROM 必须调用厂商给的 IAP 读写函数。
-
✅ data/idata RAM(右侧,00H~7FH / 80H~0FFH) 指令:
MOV -
✅ 片内 XRAM(图上叫外部 RAM:0000H ~ 02FFH,xdata) 指令:
MOVX @DPTR -
✅ EEPROM(左侧,00
1. XRAM:0000H~02FFH 和 data RAM:00H~7FH 数字重叠?
看着数字都有
00、7F,但是指令不一样,访问的是两套硬件 -
MOV 0x00, A→ 访问【data RAM 00H】(8bit 短地址,00~FF) -
MOVX DPTR=#0x0000, MOVX A,@DPTR→ 访问【XRAM 0000H】(16bit 地址,0000~02FF)