找回密码
 立即注册
查看: 156|回复: 3

MCS-51单片机中的pdata到底是个什么?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-15 11:25:01
已绑定手机

29

主题

349

回帖

1987

积分

金牌会员

机长

积分
1987
发表于 2025-5-30 20:21:34 | 显示全部楼层 |阅读模式

可能有人会觉得这个问题太简单了,几乎所有国内能找到的资料中都有介绍,pdata是指外部扩展内存的低256字节。
我曾经很长一段时间也是这么认为的,但这……真的就是对的吗?

让我们重新回顾一下dataidataxdatapdata的区别:
data是内部RAM的低128字节,即可以使用直接寻址也可以使用间接寻址。
从汇编层面来看的话,假设想把0x12这个数存到data区域中0x11这个地址中,下面的写法都是可以的:

mov 11H, #12H

mov R0, #11H
mov @R0, #12H

idata是内部RAM的高128字节,只能使用间接寻址。 从汇编层面来看的话,假设想把0xA0这个数存到idata区域中0x81这个地址中,只能使用下面的写法:

mov R0, #81H
mov @R0, #A1H

xdata是外部扩展内存,最大寻址范围是64K字节,只能使用间接寻址,并且地址寄存器使用的是比较特殊的DPTR,之所以说它特殊是因为DPTR是一个16位寄存器(可分为DPH和DPL两个8位寄存器)。
从汇编层面来看的话,假设想把0x34这个数存到xdata区域中0x1234这个地址中,只能使用下面的写法:

mov A, #34H
mov DPTR, #1234H
movx @DPTR, A

pdata也是外部扩展内存,只能使用间接寻址,但它使用R0R1作为地址寄存器,由于R0R1都是8位寄存器,所以pdata的寻址范围是256字节。
从汇编层面来看的话,假设想把0x56这个数存到pdata区域中0x34这个地址中,只能使用下面的写法:

mov A, #56H
mov R0, #34H
movx @R0, A

到这里为止一切似乎都是完美的,由于pdata使用了R0R1作为地址寄存器,所以它的寻址范围最大只能到255,这不就是外部扩展内存的低256字节吗?

我另一篇帖子中注意到了了sdcc的xdata初始值不正确问题(见https://www.stcaimcu.com/thread-18141-1-1.html),后来现在sdcc源码中看到,在处理xdata内存时,也只使用了8位地址寄存器R0R1,不过另外配合了另一个地址高8位寄存器_PAGE(其实就是P2)。

fb8c874a2e908f2cdbfd37da399da2e3.png
结合这张图就很明了了,传统8051扩展RAM时,用到了P0P2端口,P0是8位低地址和8位数据复用,P2是8位高地址。当使用R0R1作为地址寄存器时,虽然看起来只能访问256字节的扩展内存,但只要配合好用P2锁存高8位的地址,仍然可以完整访问整个扩展RAM的64KB地址空间。

最后回到开头的问题,pdata是外部扩展内存的低256字节吗?
答:不是!还需要看当前的分页(page),这其实也是pdata中p的由来。

再附注:由于STC单片机是内部模拟的扩展RAM,整个page机制是完全失效的,所以再使用pdata很可能产生bug,这应该也是STC官方强烈建议不要使用pdata的原因。

业余撸代码,专业开飞机 https://gitee.com/STC-MCU
回复

使用道具 举报 送花

3

主题

727

回帖

165

积分

等待验证会员

积分
165
发表于 2025-5-30 20:23:00 | 显示全部楼层
在数据结构和内存管理领域,理解不同扩展内存区域(如data、idata、xdata和pdata)的区别是至关重要的。以下是这些区域的基本概念和区别:

1. data区域(内部 RAM的低128字节)
定义:data是内部内存中的低128字节,可以使用直接寻址或间接寻址。
特点:数据区域是通用的,可以存储各种数据类型。
汇编写法:
直接寻址:mov 11H, #12H(将字节11存入地址12)。
间接寻址:mov R0, #11H(将寄存器11的内容存入地址11)。

2. idata区域(内部 RAM的高128字节)
定义:idata是内部内存中的高128字节,只能使用间接寻址。
特点:数据区域是内部的,用于存储内部数据。
汇编写法:
直接寻址:不可能,只能使用间接寻址。
间接寻址:mov R0, #81H(将寄存器81的内容存入地址81)。

3. xdata区域(外部扩展内存)
定义:xdata是外部扩展内存,最大寻址范围是64K字节,只能使用间接寻址。
特点:xdata区域用于外部数据,用于数据通信或存储。
寄存器和地址寄存器:
寄存器:DPTR(Data Pointer Register)是一个16位寄存器,由DPH(Data Pointer)和DPL(Data Pointer Line)组成。
地址寄存器:DPTR用于为xdata区域提供地址。
汇编写法:
直接寻址:不可能,只能使用间接寻址。
间接寻址:mov A, #34H(将字节34存入地址34)。
汇编中常用的“mov DPTR, #1234H”(将DPTR指向地址1234)。

4. pdata区域(外部扩展内存,特殊性)
定义:pdata是外部扩展内存,也只能使用间接寻址。
特点:与xdata类似,但地址寄存器(DPTR)使用的是特殊类型(DPH和DPL)。DPTR可以是128位的,因此数据区域的寻址范围是256字节。
汇编写法:
直接寻址:不可能,只能使用间接寻址。
间接寻址:mov A, #56H(将字节56存入地址56)。
汇编中常用的“mov R0, #34H”(将寄存器34的内容存入R0)。

区别总结
xdata和pdata:xdata和pdata的最大区别在于地址寄存器的类型。xdata的DPTR是128位的,而pdata的DPTR是8位的(R0或R1)。
寻址范围:data(内部)至128字节,idata至128字节,xdata至64K字节,pdata至256字节。
寄存器使用:data和idata使用直接和间接寻址,而xdata和pdata只能使用间接寻址。

实际应用中的区别
在汇编编写中,xdata和pdata的写法有所不同:
xdata区域:使用“mov DPTR, #地址”来设置DPTR指向的地址。
pdata区域:使用“mov R0, #地址”或“mov R1, #地址”来设置R0或R1指向的地址。

总结
data区域:通用内存,直接或间接寻址,最大128字节。
idata区域:内部内存,只能间接寻址,最大128字节。
xdata和pdata区域:外部扩展内存,只能间接寻址,xdata至64K,pdata至256字节,且xdata和pdata的寄存器类型不同。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-06-16 00:04:38
已绑定手机

7

主题

96

回帖

1195

积分

金牌会员

积分
1195
发表于 2025-5-30 22:33:23 | 显示全部楼层
跟着大佬学知识,期待下期精彩讲解

点评

我不是啥大佬,只是个爱好嵌入式的业余玩家[笑哭]  发表于 2025-5-30 22:46
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 04:40 , Processed in 0.181936 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表