一、存储类型关键字

1.1 sdcc中特殊关键字的使用

sdcc提供和keil一样的特殊关键字来指定变量的存储类型,和keil不同的是,sdcc在使用c51专用的特殊关键字时,要用两个下划线作为前缀,比如申明一个idata存储类型的变量时语句如下。

__idata unsigned char i;

1.2 __data类型

该类型是small存储模式下默认使用的存储类型,对应直接寻址方式。

1.3 __pdata类型

该类型是medium存储模式下默认使用的存储类型,对应8bit的寄存器间接寻址。

1.4 __xdata类型

该类型是large存储模式下默认使用的储存类型,对应16bit的寄存器间接寻址。

1.5 __idata类型

用间接寻址的方式,用这种方式可以访问片内ram的高128bit,当然也可以同时访问低128bit,只是效率会降低。之所以有这个关键字存在,应该是由于许多51单片机将最初的128bit的内部ram扩展到了256bit。它和pdata在间接寻址上的区别是无需用寄存暂存要赋值的数值。

1.6 __code类型

将数据存在rom中,只能存储常量。

1.7 __bit类型

用来定义bit变量,51的位寻址区在内置ram的0x20-0x2f区域,共128个bit位。

1.8 __sfr类型

用来定义特殊功能寄存器

定义P0口

__sfr __at (0x80) P0;

一般情况下sdcc提供的头文件里已经将51的特殊功能寄存器全都定义好了,所以这个关键字很少使用。

1.9 不同存储空间的指针

sdcc允许指针指向不同类型的存储空间,这样的指针有三个字节,第一个字节表示指向的区域。下面拷贝一段man上的例子:

/* pointer physically in internal ram pointing to object in external
ram */
__xdata unsigned char * __data p;
/* pointer physically in external ram pointing to object in internal
ram */
__data unsigned char * __xdata p;
/* pointer physically in code rom pointing to data in xdata space
*/
__xdata unsigned char * __code p;
/* pointer physically in code space pointing to data in code space
*/
__code unsigned char * __code p;
/* generic pointer physically located in xdata space */
unsigned char * __xdata p;
/* generic pointer physically located in default memory space */
unsigned char * p;
/* the following is a function pointer physically located in data
space */char (* __data fp)(void);

1.10 at关键字

at关键字可以指定变量的存储地址,这可以减少指针的使用,以及直接地址访问这样的语句。

__xdata __at (0x7ffe) unsigned int chksum;
__code __at (0x7ff0) char Id[5] = ”SDCC”;
volatile __xdata __at (0x8000) unsigned char PORTA_8255;
__bit __at (0x02) bvar;

使用时需要注意指定的地址是否在overlay区。

1.11 小结

  • small模式下默认使用data存储变量,medium模式下用xdata,large模式下用pdata
  • data和idata用于变量存在片内ram,xdata和pdata用于指定变量存在外部ram
  • data用于片内ram的低128bit, idata用于片内的高128bit
  • xdata用于片外ram的低256bit,pdata用于片外ram的64K
  • bit用于位寻址,sfr用于特殊功能寄存器,code用于rom

二、实验

针对sdcc的储存类型关键字,下面做一个实验来做进一步的学习。

首先写这样一个程序,然后编译。

$vim test.c__data unsigned char data_v;
__idata unsigned char idata_v;
__pdata unsigned char pdata_v;
__xdata unsigned char xdata_v;__code unsigned char code_v  = 0xff;void main()
{unsigned char i;data_v =  1;idata_v = 1;pdata_v = 1;xdata_v = 1;i = code_v;
}

先看看他们被分配的区域

data_v被分配在内部ram的前8个字节后:

;--------------------------------------------------------
; overlayable register banks
;--------------------------------------------------------.area REG_BANK_0        (REL,OVR,DATA).ds 8
;--------------------------------------------------------
; internal ram data
;--------------------------------------------------------.area DSEG    (DATA)
_data_v::.ds 1

idata_v被分配data之后,它之后区域就是栈区了:

;--------------------------------------------------------
; indirectly addressable internal ram data
;--------------------------------------------------------.area ISEG    (DATA)
_idata_v::.ds 1

pdata和xdata都被分配在外存:

;--------------------------------------------------------
; paged external ram data
;--------------------------------------------------------.area PSEG    (PAG,XDATA)
_pdata_v::.ds 1
;--------------------------------------------------------
; external ram data
;--------------------------------------------------------.area XSEG    (XDATA)
_xdata_v::.ds 1

接着看对他们的处理方式

;       test.c:14: data_v =  1;mov     _data_v,#0x01
;       test.c:15: idata_v = 1;mov     r0,#_idata_vmov     @r0,#0x01
;       test.c:16: pdata_v = 1;mov     r0,#_pdata_vmov     a,#0x01movx    @r0,a
;       test.c:17: xdata_v = 1;mov     dptr,#_xdata_vmov     a,#0x01movx    @dptr,a

很明显,data使用了立即寻址,而pdata和xdata都使用了movx指令来访问外存。

sdcc man阅读笔记(四)——存储类型关键字相关推荐

  1. JS高级程序设计——阅读笔记四

    JS高级程序设计--阅读笔记四 第六章 集合引用类型 6.1 Object 6.2 Array 6.2.1 创建数组 from()函数 6.2.2 数组空位 6.2.3 数组索引 6.2.4 检测数组 ...

  2. C语言 存储类型关键字详解

    今天我们重点说下auto,register,typedef,extern,和static. 让我们进入今天的学习吧!(今天也要加油哦) 1. auto(自动变量) auto作为比较老的关键字,在C语言 ...

  3. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  4. C++的35个技巧阅读笔记(四)

    文章目录 28.Smart Pointers(智能指针) 29.Reference counting(引用计数) 30.Proxy classes(替身类.代理类) 31.让函数根据一个以上的对象类型 ...

  5. SEO阅读笔记四(关键字)

    关键字是什么?       关键字是你想要你的网站被发现的短语.关键字不是关于你称呼的是什么,关键字是你认为一般冲浪者(或者你的未来的站点浏览者) 可能键入搜索框的短语.       在搜索引擎优化的 ...

  6. c++ primer 第五版 阅读笔记四

    第四章 复合类型 4.1 数组 数组的声明:关于数组的内容写了蛮多的,包括一维数组和二维数组的创建.调用.返回等等,甚至用到了static和new/delete关键字,详见:(一维数组相关内容)htt ...

  7. C语言再学习 -- 存储类型关键字

    定义: 是对声明的实现或者实例化.连接器(linker)需要它(定义)来引用内存实体.与上面的声明相应的定义如下:参看:C语言再学习 -- 存储类.链接 C语言中有 5 个作为存储类说明符的关键字,分 ...

  8. 编程修养 阅读笔记四

    转载:http://blog.csdn.net/haoel/article/details/2872 26.为常量声明宏 -------- 最好不要在程序中出现数字式的"硬编码"( ...

  9. c语言存储类型关键字作用,C语言, 存储类型关键字?

    1.C语言的数据类型分类 C语言的数据类型分类: 基本数据类型: 整型int 字符型char 浮点型: 单精度浮点型float 双精度浮点型double 构造数据类型: 数组(如int a[]) 结构 ...

  10. c语言4钟存储类型关键字用法,求C语言中的32个关键字及其意思? C语言中32个关键字的意思和用法~!...

    C语言中的32个关键字及其意思如下: 1.auto    声明自动变量 2.short    声明短整型变量或函数 3.int    声明整型变量或函数 4.long    声明长整型变量或函数 5. ...

最新文章

  1. SAP Business Explorer 初探
  2. c# websocketServer传图片
  3. 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)
  4. SharedPointer
  5. 随机文件处理函数应用
  6. python继承实现原理封装property
  7. android 显示flash视频播放器
  8. mysql 嵌入式linux版本_PHP专栏 : MySQL 数据库安装详细
  9. Oracle 11g 扩展UNDO表空间
  10. 论文被引上千次,GitHub 开源6000星,他们是首届字节跳动奖学金获奖者
  11. 微创新:粉丝电子商务及微博的9种盈利模式
  12. SAP中看板拉料驱动MM物料移动的简单测试过程
  13. P1129 矩阵游戏
  14. Latex常用符号表
  15. phpwind mysql 密码_PhpWind教程:MySQL数据库密码修改方法
  16. RS WLAN产品测试全面解决方案
  17. 数据治理和数据安全治理有何不同?
  18. oracle 10092,Oracle诊断事件列表
  19. 华为云classroom Java练习
  20. Python日记(1)——求dy/dx

热门文章

  1. 鼠标跟随flash代码_Flash动画设计之 MTV实例创作《不说再见》
  2. 阜阳师范学院java,刘冬冬 - 阜阳师范学院 - 计算机与信息工程学院
  3. 一步步教你装超强插件~油猴插件管理器Tampermonkey
  4. 等保2.0中的工业控制系统(ICS)指的是什么
  5. Cloud 团队:让 TiDB 在云上跳舞 | PingCAP 招聘季
  6. idb 怎么回复mysql_mysql利用frm和idb文件恢复数据库
  7. 德州大学奥斯汀分校计算机科学排名,德州大学奥斯汀分校专业排名一览及最强专业推荐(QS世界大学排名)...
  8. 学习大数据最正确的步骤(0基础必备)
  9. Retrofit2基本使用
  10. 在PS中快速制作发朋友圈的九宫格切图