找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3992|回复: 6
收起左侧

51单片机定义的变量默认是存在哪个区域的?

[复制链接]
ID:847776 发表于 2021-6-8 12:57 | 显示全部楼层 |阅读模式
数据区包含data、idata、bdata、xdata等,定义变量时,加上这几个存储区域类型关键字,就能指定变量存储的位置,那么如果不指定,其默认是放在哪里的呢?
如,定义一个全局变量 unsigned char x;  这里的x ,默认是放到哪个区域的?
如,定义一个局部变量unsigned char x; 这里的x,又默认是放到哪个区域的?
回复

使用道具 举报

ID:275826 发表于 2021-6-8 15:23 | 显示全部楼层
这个是由储存模式决定的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:934874 发表于 2021-6-8 15:48 | 显示全部楼层
数据空间又分为内部数据空间(IRAM)和外部数据空间(XRAM),他们的大小和访问速度有很大区别。用data、bdata、idata、pdata、xdata修饰变量时,会导致变量存在不同的数据空间中,从而导致访问速度的差异。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:818024 发表于 2021-6-8 15:48 | 显示全部楼层
默认当然是存在内存里,反正不在flash里,全局变量存在编译器定义的静态存储区,局部变量在栈里面

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:155507 发表于 2021-6-8 16:45 | 显示全部楼层
如,定义一个全局变量 unsigned char x;  这里的x ,默认是放到哪个区域的?
DATA
如,定义一个局部变量unsigned char x; 这里的x,又默认是放到哪个区域的?
寄存器

  1. #include "reg51.h"


  2. #define uchar unsigned char  
  3. #define uint  unsigned int  

  4. unsigned char Ex;  //定义一个全局变量

  5. void delay()
  6. {
  7.         unsigned char x;  //定义一个局部变量
  8.         for(x=0;x<150;x++)
  9.         {
  10.                 ;
  11.         }
  12. }

  13. void main()
  14. {
  15.         Ex =1;
  16.         delay();
  17.        
  18. }
复制代码

  1. C51 COMPILER V9.52.0.0   TEST001                                                           06/08/2021 16:36:51 PAGE 1   


  2. C51 COMPILER V9.52.0.0, COMPILATION OF MODULE TEST001
  3. OBJECT MODULE PLACED IN Test001.OBJ
  4. COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Test001.c BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS TABS(2)

  5. line level    source

  6.    1          #include "reg51.h"
  7.    2         
  8.    3         
  9.    4          #define uchar unsigned char  
  10.    5          #define uint  unsigned int  
  11.    6         
  12.    7          unsigned char Ex;  //定义一个全局变量
  13.    8         
  14.    9          void delay()
  15.   10          {
  16.   11   1        unsigned char x;  //定义一个局部变量
  17.   12   1        for(x=0;x<150;x++)
  18.   13   1        {
  19.   14   2          ;
  20.   15   2        }
  21.   16   1      }
  22.   17         
  23.   18          void main()
  24.   19          {
  25.   20   1        Ex =1;
  26.   21   1        delay();
  27.   22   1        
  28.   23   1      }
  29. C51 COMPILER V9.52.0.0   TEST001                                                           06/08/2021 16:36:51 PAGE 2   

  30. ASSEMBLY LISTING OF GENERATED OBJECT CODE


  31.              ; FUNCTION delay (BEGIN)
  32.                                            ; SOURCE LINE # 9
  33.                                            ; SOURCE LINE # 10
  34.                                            ; SOURCE LINE # 12
  35. ;---- Variable 'x' assigned to Register 'R7' ----
  36. 0000 E4                CLR     A
  37. 0001 FF                MOV     R7,A
  38. 0002         ?C0001:
  39.                                            ; SOURCE LINE # 13
  40.                                            ; SOURCE LINE # 15
  41. 0002 0F                INC     R7
  42. 0003 BF96FC            CJNE    R7,#096H,?C0001
  43.                                            ; SOURCE LINE # 16
  44. 0006         ?C0004:
  45. 0006 22                RET     
  46.              ; FUNCTION delay (END)

  47.              ; FUNCTION main (BEGIN)
  48.                                            ; SOURCE LINE # 18
  49.                                            ; SOURCE LINE # 19
  50.                                            ; SOURCE LINE # 20
  51. 0000 750001      R     MOV     Ex,#01H
  52.                                            ; SOURCE LINE # 21
  53. 0003 020000      R     LJMP    delay
  54.              ; FUNCTION main (END)

  55. C51 COMPILER V9.52.0.0   TEST001                                                           06/08/2021 16:36:51 PAGE 3   

  56. NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
  57. ====                                    =====   ======  ====    ======  ====


  58. delay. . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  59.   x. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
  60. main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  61. Ex . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   U_CHAR   0000H  1


  62. MODULE INFORMATION:   STATIC OVERLAYABLE
  63.    CODE SIZE        =     13    ----
  64.    CONSTANT SIZE    =   ----    ----
  65.    XDATA SIZE       =   ----    ----
  66.    PDATA SIZE       =   ----    ----
  67.    DATA SIZE        =      1    ----
  68.    IDATA SIZE       =   ----    ----
  69.    BIT SIZE         =   ----    ----
  70. END OF MODULE INFORMATION.


  71. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
复制代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:847776 发表于 2021-6-9 12:05 | 显示全部楼层
angmall 发表于 2021-6-8 16:45
如,定义一个全局变量 unsigned char x;  这里的x ,默认是放到哪个区域的?
DATA
如,定义一个局部变量u ...

谢谢,后面的汇编看不懂,但后面的存储区域分配基本看明白了,相当于不管全局变量还是局部变量都是默认放在data区,因为data区包含了寄存器组和bdata区,其中局部变量特别放到了寄存器组里面。
回复

使用道具 举报

ID:81196 发表于 2021-6-17 11:26 | 显示全部楼层
全局变量和局部变量的存放有堆和栈的区分.即使局部变量,如果加上static也相当于一个全局变量
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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