1 内部RAM
内部RAM共256个字节,分为两个部分,低128字节和高128字节,低128字节是传统51单片机的地址,既可以直接寻址也可以间接寻址,高128位是在8052中扩展的,这部分RAM和特殊功能寄存器使用相同的逻辑地址(80H到FFH),但是在物理上是独立的,在使用时通过不同的寻址方式加以区分,高128字节的RAM只能间接寻址,特殊功能寄存器只能直接寻址
低128字节的RAM成为通用RAM区,通用 RAM 区又可分为工作寄存器组区,可位寻址区,用户 RAM区和堆栈区。工作寄存器组区地址从 00H~1FH 共 32 字节单元,分为 4 组,每一组称为一个寄存器组,每组包含 8 个 8 位的工作寄存器,编号均为 R0 ~ R7,但属于不同的物理空间。通过使用工作寄存器组,可以提高运算速度。 R0~R7 是常用的寄存器,提供 4 组是因为 1 组往往不够用。程序状态字 PSW 寄存器中的 RS1 和RS0 组合决定当前使用的工作寄存器组。
可位寻址区的地址从 20H ~ 2FH 共 16 个字节单元。 20H~2FH 单元既可像普通 RAM 单元一样按字节存取,也可以对单元中的任何一位单独存取,共 128 位,所对应的逻辑位地址范围是 00H~7FH。位地址范围是00H~7FH,内部 RAM 低 128 字节的地址也是 00H~7FH,从外表看,二者地址是一样的,实际上二者具有本质的区别;位地址指向的是一个位,而字节地址指向的是一个字节单元,在程序中使用不同的指令区分。
内部 RAM 中的 30H~FFH 单元是用户 RAM 和堆栈区。一个 8 位的堆栈指针(SP),用于指向堆栈区。单片机复位后,堆栈指针 SP 为 07H,指向了工作寄存器组 0 中的 R7,因此,用户初始化程序都应对 SP 设置初值,一般设置在 80H 以后的单元为宜。堆栈指针是一个 8 位专用寄存器。它指示出堆栈顶部在内部 RAM 块中的位置。系统复位后, SP 初始化位 07H,使得堆栈事实上由 08H 单元开始,考虑 08H~1FH 单元分别属于工作寄存器组 1~3,若在程序设计中用到这些区,则最好把 SP 值改变为 80H 或更大的值为宜。 STC8 系列单片机的堆栈是向上生长的,即将数据压入堆栈后, SP 内容增大。
在Keil编程中,高128字节使用许增加 idata 关键字进行间接寻址
直接寻址,表示访问特殊功能寄存器 MOV 0x90, #0x00 间接寻址,表示访问高128字节的RAM MOV R0, #0x90H, MOV @R0, #0x00
当一个变量增加idata时,将会生成间接寻址的汇编代码
2 外部RAM
外部RAM在Kernel中使用xdata表示,其中pdata表示xdata的低256个字节 C 语言中定义变量为 pdata 类型后,编译器会自动将变量分配在xdata的 0000H~00FFH 区域,并使用 MOVX @Ri, A 和 MOVX A, @Ri 进行访问,默认情况下xdata使用DPTR进行访问
如这个声明,假如i的地址为0x19,则 xdata int i = 0 生成如下汇编 MOV DPTR,#0x0019 CLR A MOVX @DPTR, A
如这个声明,假如j的地址为0x19,则 pdata int j = 0 生成如下汇编 MOV R0, #0x19 CLR A MOVX @R0, A
变量在各个RAM区域中使用的指令不一样,导致性能不一样,根据机器码的长度我们大致可以知道,xdata > pdata > idata > data(默认)
标签:idata,字节,RAM,51,单片机,寻址,寄存器,128,堆栈 From: https://www.cnblogs.com/sudochen/p/16619348.html