c语言寄存器定义
‘壹’ 51单片机中如何用c语言自定义一个寄存器,求大神帮忙
寄存器是CPU内部重要的数据存储资源,主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间,也就是说CPU操作寄存器比操作内存快(寄存器是直接存取,而内存是寻址存取)。
汇编比C语言效率高,经常操作寄存器也是一个原因吧。
C语言可以把变量定义为寄存器类型的,将数据直接存放在CPU的寄存器中,使用关键字register定义变量。
例如register a=123;定义a为寄存器类型变量。
使用register定义的变量尽可能存放到寄存器中,但不绝对。
‘贰’ C语言中,如何定义单片机的寄存器
位地址在汇编语言中,只能直接寻址,不支持间接寻址。那么,在 C 语言中,也就不能用指针来操作。所以不能定义单片机的寄存器。
访问寄存器可以通过直接地址引用来完成。
例如52单片机的寄存器有4组,分别为00H-07H,08H-0FH,10H-17H,18H-1FH,各组均8字节,要结合程序状态字寄存器PSW(D0H)中的RS0,RS1的组合来确定是哪一组。
可以定义一个访问Rn的函数typedefunsignedcharuchar;
uchardacRn(ucharn)//n=[0..7]
{
uchardata*p;
n+=(PSW&0x18);//PSW7:CY6:AC5:F04:RS13:RS02:OV1:F10:P
//本来要右移三位变为0-3,但由于是8个一组要乘以8(左移3位),所以直接加上寄存器编号就可以了
return*(uchardata*)n;
}
‘叁’ C语言中可以定义寄存器变量到底可以定义多少空间的寄存器变量我该如何知道这个区域的大小
register是一个"建议"型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,所以可以不用纠结这个了。
如果你想了解有CPU多少寄存器,可参考下面资料:
新型 x86 处理器提供以下可以通过编译器进行分配的寄存器:8 个 32 位的通用寄存器、8 个 80 位的浮点寄存器和 8 个 128 位的矢量寄存器。所有 x64 处理器提供 16 个 64 位的通用寄存器、8 个 80 位的浮点寄存器和至少 16 个矢量寄存器(每个矢量寄存器至少 128 位)。新型 32 位 ARM 处理器提供 15 个 32 位的通用寄存器和 32 个 64 位的浮点寄存器。所有 64 位的 ARM 处理器提供 31 个 64 位的通用寄存器、32 个 128 位的浮点寄存器和 16 个 128 位的矢量寄存器 (NEON)。
‘肆’ 什么是寄存器
在数电里,寄存器是指由基本的RS触发器结构衍生出来的D触发, 就是一些与非门构成的结构。寄存器是由触发器组成的。一个触发器就是一个一位寄存器。存储器(分为只读存储器ROM和随机存取存储器RAM )由寄存器组成,可以看作一个寄存器堆,每个存储单元实际上相当与一个缓冲寄存器。
‘伍’ C语言中的寄存器是什么干什么用
寄存器是和硬件有关的,和你的C语言写的程序所运行的平台有关。积存器就是硬件中存放一些数据,变量的地方,有相应的含义。
‘陆’ C语言中的自动变量和寄存器变量是什莫
C语言学习之变量存储
C语言中对变量的说明包括两方面的内容:变量类型以及变量的存储类型。变量类型如:int(整形),char(字符型)是用来说明变量所占用的内存空间的大小。变量存储类型用来说明变量的作用范围。
C语言的变量存储类有:自动类、寄存器类、静态类和外部类。
关键字auto加在变量名及其类型前,用来说明它是自动变量。局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进 行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上 从来不用。 局部变量在函数调用时自动产生, 但不会自动初始化, 随函数调用的结束, 这个变量也就自动消失了, 下次调用此函数时再自动产生, 还要再赋值, 退出时又自动消失。
static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
1. 静态局部变量
它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它
函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。
2. 静态全程变量
静态 全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与
全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用,而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。
extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外, 还要 被其它文件使用。因此, 必须将全程变量通知每一个程序模块文件, 此时可用 extern来说明。
寄存器变量to能够长在执行速度很重要的情况下使用。其思想是告诉编译程序把该变量放在一个CPU寄存器中。因为数据在寄存器中操作比在内存中快,这样就提高了程序代码的执行速度。寄存器变量的说明是在变量名及类型之前加上关键字register。值得注意的是取地址运算符&不能作用于寄存器变量。
file1.c
#include <stdlib.h>
#include <stdio.h>
int reset();
int next();
int last();
int sum(int );
int i=1;
void main()
{
auto int i,j;
i=reset();
for(j=1;j<=3;j++)
{
printf("i=%d\tj=%d\n",i,j);
printf("next(i)=%d\n",next());
printf("last(i)=%d\n",last());
printf("sum(i+j)=%d\n",sum(i+j));
}
}
file2.c文件
static int i=10;
int next()
{
return(i+=1);
}
int last()
{
return(i-=1);
}
int sum(int i)
{
static int j=5;
return(i=j+=i);
}
file3.c文件
extern int i;
reset()
{
return(i);
}
运行结果:
i=1 j=1
next(i)=11
last(i)=10
sum(i+j)=7
i=1 j=2
next(i)=11
last(i)=10
sum(i+j)=10
i=1 j=3
next(i)=11
last(i)=10
sum(i+j)=14
具体分析一下三个文件中的变量的种类。
在file1.c的开头声明i是外部变量,并出示化为1。而在main函数内部,说明了两个自动变量i和j,这样在main内部出现的i就是自动量。在file3.c的开头说明i是外部的,表明它与file1.c定义的i是同一个变量,所以reset的值返回的就是这个i的当前值1。file2.c文件已开始就定义了变量i,并声明为静态变量,因此它的使用范围只在当前文件中使用。然而从函数sum中定义来看,其内部用到的i是形式参数,j是内部静态变量,它们与以前的i,j都不同。
具体执行过程分析如下:
首先程序经过编译后声称可执行文件,运行可执行文件后,函数从Main函数体进入,在初始化的过程中得到i为全局变量,初值为1。进入main函数后首先调用函数reset(),进入文件file3.c,文件file3.c声明i为外部变量,所以此时i的值为1,则返回的值为1。函数reset()执行完后返回主函数,继续执行循环体中的程序。循环体首先调用函数next(),程序进入file2.c文件,判断i为静态变量,所以此时i的值为10,执行next()之后i的值为11,返回值为11,并将11作为i的值。当调用last()函数时,判断i的值为11,执行函数后,i的值变为10,并将10作为i的值。最后执行函数sum(i),此时值的注意的是执行程序时传递的是形参,即第一次调用时实际计算的值为sum(i+j=2),这样调用函数sum(i)后执行的结果为i=5+2=7,即为执行的结果。依次类推,分别为7,10,14。
通过以上的程序可以理解不同的存储类型的作用范围不同,在程序设计中如何灵活的使用各种不同的存储类型是能够使程序更灵活。
‘柒’ C++中 什么是 寄存器
C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写, 这样可提高效率。寄存器变量的说明符是register。 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。
[例5.16]
求∑200i=1imain()
{
register i,s=0;
for(i=1;i<=200;i++)
s=s+i;
printf("s=%d\n",s);
}
本程序循环200次,i和s都将频繁使用,因此可定义为寄存器变量。对寄存器变量还要说明以下几点:
1. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。
‘捌’ c语言的特殊寄存器定义
0x80为一个地址,其后一个字节表示的是p0的地址。相当于0x80处存入的是一个地址,这个地址是p0的,它的长度为一个字节。
‘玖’ C语言中的sfr表示什么意思
SFR是Special Function Register特殊功能寄存器。
SFR是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据。它是80C51单片机中最具有特殊的部分,现在所有80C51系列功能的增加和扩展几乎都是通过增加特殊功能寄存器SFR来达到目的的。
对于80C51系列中的80C51,共定义了21个特殊功能寄存器。在80C52中,除了80C51的21个特殊功能寄存器,还增加了5个,共计26个(带星号的为特殊功能寄存器)。
‘拾’ c语言 程序寄存器是什么情况啊
寄存器是硬件资源,是比内存速度要快的一种存储单元
,集成在CPU内部和CPU同步,属于稀缺资源,所以经常有申请不到的情况
也就是说C语言里的reg类型数据有时候不一定能放到寄存器里