C keyword register 并讨论共同使用嵌入式汇编
C keyword register 并讨论共同使用嵌入式汇编
register 是C99 的keyword之中的一个.
register 是储存类型之中的一个.这里仅讨论register 储存类型。auto static extern的各种故事请移步《C on pointer》
A declaration of an identifier for an object with storage-class specifier register suggests that access to the object be as fast as possible. The extent to which such suggestions are effective is implementation-defined.
也就是说。你给一个变量加上register的储存类型修饰符,也仅仅是向编译器说明
“嘿,哥们儿,这个变量我要常常訪问的,我想尽可能快的訪问这个变量”
訪问一个变量最快的储存类型?寄存器类型
接着编译器会依据实际情况来,看有没有剩余的经常使用寄存器来储存这个变量,有,太好了。把变量放到寄存器里面去。没有?那也没办法,寄存器用作数据交换。比較忙。你的register修饰符也没用
例如说 register int varible; 假设申请使用寄存器做储存类型失败,就会把varible 觉得int 类型。
GCC的实现策略:
The implementation may treat any register declaration simply as an auto declaration. However, whether or not addressable storage is actually used, the address of any part of
an object declared with storage-class specifier register cannot be computed, either explicitly (by use of the unary & operator as discussed in 6.5.3.2) or implicitly (by converting an array name to a pointer as discussed in 6.3.2.1). Thus, the only
operator that can be applied to an array declared with storage-class specifier register is sizeof.
上面这段话指明了GCC的实现策略。就是简单的把register 声明简单的当做auto对待。一旦是寄存器变量,你就不能对其进行寻址了,仅仅能用sizeof。光说没用,測试才是硬道理.
咯,gcc 的报错就在这里(我把优化级别降到了最低-O,并且加入了printf打印语句就是操心gcc把程序非常多部分优化掉了.)
这里是register 申请成功的情况,可是这里的申请寄存器做储存类型有时候页会失败的(默认auto了)
依据@浪陨 的提示。假设使用嵌入式汇编就能强制的把变量的储存类型定做register。
这样的做法在 赵炯的《凝视》里面页有提到(page 48 第三章 3.3.2)
“ 假设想指定寄存器(比如 eax)那么我们能够把该语句写成 register char __res asm("ax"); ”
到了汇编层面。do what you want。坏笑....
这样的定义方式确实比較“霸道”,占用了寄存器,在其生命周期内不同意别的变量使用该寄存器. 寄存器是非常宝贵的~
如有误解。往批评指正.
版权声明:本文博客原创文章,博客,未经同意,不得转载。
C keyword register 并讨论共同使用嵌入式汇编的更多相关文章
- linux-0.11 内核源码学习笔记一(嵌入式汇编语法及使用)
linux内核源码虽然是用C写的,不过其中有很多用嵌入式汇编直接操作底层硬件的“宏函数”,要想顺利的理解内核理论和具体实现逻辑,学会看嵌入式汇编是必修课,下面内容是学习过程中的笔记:当做回顾时的参考. ...
- X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- GCC嵌入式汇编(内嵌汇编)入门
GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...
- 《Linux内核分析》 week4作业-使用嵌入式汇编调用一个系统调用
一.fork的嵌入式汇编执行 #include <stdio.h> #include <unistd.h> int main(){ pid_t pid; asm volatil ...
- 尝试优化骨骼动画计算的意外收获——使用嵌入式汇编对float转int进行优化
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4984530.html 公司引擎目前是使用CPU计算骨骼动画(采用了D3DX提供的函数 ...
- C语言嵌入式系统编程修炼
C语言嵌入式系统编程修炼 2008-08-19 作者:宋宝华 来源:天极网 C语言嵌入式系统编程修炼之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程 ...
- 嵌入式系统coredump设计
阴沟翻船,马失前蹄,说明凡事皆有可能.自然,程序设计的再好,也会有crash的时候.开发期还还说,正式交付的系统crash自然更是难以承受的.无论何时,死一次就够了,得有方法查个水落石出. 几年前哥去 ...
- C语言嵌入式系统编程修炼之一:背景篇
不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发 ...
- 操作系统是怎么工作的——函数的堆栈框架/嵌入式代码
1.函数堆栈框架 1.1框架模型 call指令: 1)将eip中的下一条指令的地址A保存在栈顶: 2)设置eip指向被调用程序的代码处. ret指令:将地址A恢复到eip中 这样就将函数的调用变为顺序 ...
随机推荐
- 用AS3清空容器下所有子显示对象
容器中的子显示对象分为两类: 处于显示列表中的子显示对象.被numChildren所记录的. 由容器graphics对象绘制出来的矢量图.这个矢量图不属于Shape类型,不在容器的显示列表中,不被nu ...
- BZOJ 1060: [ZJOI2007]时态同步( 树形dp )
坑爹...数据是错的..详见discuss http://www.lydsy.com/JudgeOnline/wttl/wttl.php?pid=1060 先求根到叶子的距离最大值x, 然后把所有叶 ...
- HTML5新标签
<article>标签定义外部的内容.比如来自一个外部的新闻提供者的一篇新的文章,或者来自 blog 的文本,或者是来自论坛的文本.亦或是来自其他外部源内容. HTML5:<arti ...
- thinkphp 分组、页面跳转与ajax
本节课大纲: 一.多应用配置技巧 二.使用分组 三.页面跳转 $this->success('查询成功',U('User/test')); $this->redirect('User/te ...
- JDK1.6官方下载
JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin- ...
- Adobe Acrobat Ⅺ Pro安装激活
1.注意一定要断网安装,如果你有防火墙拦截亦可(注意:系统自带那防火墙不行). 2.将AcrobatPro_11_Web_WWMUI.exe解压到一个目录下,找到目录下的setup.exe安装,安装时 ...
- WinForm----DataGridview---连接数据库,以及双击一条数据,显示信息到Label控件,也可以是TextBox控件。
最终效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...
- C++的运算符
C++的运算符十分丰富,使得C++的运算十分灵活方便.例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的.C++提供了以下运算符: 算术运算符+(加) - ...
- sencha touch笔记(5)——DataView组件(1)
1.DataView组件可以显示列表,图像等等的组件或者元素,特别适用于数据仓库频繁更新的情况.比如像显示新闻或者微博等等的很多相同样式的组件的列表这种一次性从后台或者数据源拿取很多数据展示的样式.比 ...
- 【转】[Mysql] Linux Mysql 日志专题
原文链接:http://blog.csdn.net/xiaoxu0123/article/details/6258538 1, 设置存放的目录: [root@Linux etc]# more /etc ...