导航:首页 > 源码编译 > 寄存器编译器

寄存器编译器

发布时间:2023-02-09 03:43:40

1. 常见的C语言编译器是什么

目前最流行的C语言编译器有以下几种:

1、GNU Compiler Collection 或称GCC

GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。

GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的着名例子,由自由软件基金会以GPL协议发布。

2、Microsoft C 或称 MS C

Microsoft C 是c语言的一种IDE(集成开发环境),常见的还有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,High C,Turbo C等等......

3、Borland Turbo C 或称 Turbo C

Turbo C是美国Borland公司的产品,Borland公司是一家专门从事软件开发、研制的大公司。该公司相继推出了一套 Turbo系列软件, 如Turbo BASIC, Turbo Pascal, Turbo Prolog, 这些软件很受用户欢迎。

(1)寄存器编译器扩展阅读:

C编译的整个过程很复杂,大致可以分为以下四个阶段:

1、预处理阶段在该阶段主要完成对源代码的预处理工作,主要包括对宏定义指令,头文件包含指令,预定义指令和特殊字符的处理,如对宏定义的替换以及文件头中所包含的文件中预定义代码的替换等,总之这步主要完成一些替换工作,输出是同源文件含义相同但内容不同的文件。

2、编译、优化阶段编译就是将第一阶段处理得到的文件通过词法语法分析等转换为汇编语言。优化包括对中间代码的优化,如删除公共表达式,循环优化等;和对目标代码的生成进行的优化,如如何充分利用机器的寄存器存放有关变量的值,以减少内存访问次数。

3、汇编阶段将汇编语言翻译成机器指令。

4、链接阶段链接阶段的主要工作是将有关的目标文件连接起来,即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的目标文件成为一个能够被操作系统装入执行的统一整体。

2. 什么是寄存器它有什么用

寄存器组
1、特点:读写速度快但数量较少;其数量、长度以及使用方法会影响指令集的设计。
2、组成:一组彼此独立的Reg,或小规模半导体存储器。
3、RISC:设置较多Reg,并依靠编译器来使其使用最大化。

3. 什么是寄存器什么是寄存器变量

寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个 “8 位元寄存器”或 “32 位元寄存器”。寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。 寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 “架构寄存器”。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
register[寄存器]变量告诉编译器相关的变量应该改量存储在高速度的寄存器中。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议”,并非强制要求。

4. 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. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。

5. 配置寄存器默认值为

如果不对寄存器进行任何赋值操作,其值是未知,在Verilog中用x表示。

verilog是硬件描述语言,不是软件编程语言,所以没有“执行”的概念,也没有“默认初始值”的概念;你这几句描述的是一个组合逻辑循环(combinationalLoop),这是硬件设计里的错误,初学者往往会出现这种错误。

图着色性的同构:

透过活跃变量分析(Live variable analysis),编译器可以决定哪个变量的集合在同一时间是活跃的,也就是涉入move指令的变量。使用这些信息,编译器可以建构一张图,使每个点(Vertex)在程序中代表一个独立的变量。

当变量被同时使用时,则利用干扰边(Interference edges)链接两个节点,当变量同时涉入move指令时,则创建优先边(preference edges)。可以透过K-coloring用来解决寄存器配置的问题(K为寄存器可用的数量)。

6. 寄存器原理

寄存器原理:

寄存器应具有接收数据、存放数据和输出数据的功能,它由触发器和门电路组成。只有得到“存入脉冲”(又称“存入指令”、“写入指令”)时,寄存器才能接收数据;在得到“读出”指令时,寄存器才将数据输出。

寄存器存放数码的方式有并行和串行两种。并行方式是数码从各对应位输入端同时输入到寄存器中;串行方式是数码从一个输入端逐位输入到寄存器中。

寄存器读出数码的方式也有并行和串行两种。在并行方式中,被读出的数码同时出现在各位的输出端上;在串行方式中,被读出的数码在一个输出端逐位出现。

(6)寄存器编译器扩展阅读:

寄存器最起码具备以下4种功能。

①清除数码:将寄存器里的原有数码清除。

②接收数码:在接收脉冲作用下,将外输入数码存入寄存器中。

③存储数码:在没有新的写入脉冲来之前,寄存器能保存原有数码不变。

④输出数码:在输出脉冲作用下,才通过电路输出数码。

仅具有以上功能的寄存器称为数码寄存器;有的寄存器还具有移位功能,称为移位寄存器。

寄存器有串行和并行两种数码存取方式。将n位二进制数一次存入寄存器或从寄存器中读出的方式称为并行方式。将n位二进制数以每次1位,分成n次存入寄存器并从寄存器读出,这种方式称为串行方式。并行方式只需一个时钟脉冲就可以完成数据操作,工作速度快,但需要n根输入和输出数据线。串行方式要使用几个时钟脉冲完成输入或输出操作,工作速度慢,但只需要一根输入或输出数据线,传输线少,适用于远距离传输。

7. 单片机中什么是寄存器

寄存器是指由基本的RS触发器结构衍生出来的D触发,
类似于内存,可以存数据,但一般比内存操作更容易,
一般可直接位操作速度更快,而内存追求的是高密度,
低成本低功耗

8. “Keil C51”下如何让编译器优先使用片内“RAM”

C51内存结构深度剖析x0dx0a在编写应用程序时,定义一个变量,一个数组,或是说一个固定表格,到底存储在什么地方;当定义变量大小超过MCU的内存范围时怎么办;如何控制变量定义不超过存储范围;以及如何定义变量才能使得变量访问速度最快,写出的程序运行效率最高。以下将一一解答。x0dx0ax0dx0a1 六类关键字(六类存储类型)x0dx0adata idata xdata pdata code bdatax0dx0ax0dx0a code: code memory (程序存储器也即只读存储器)用来保存常量或是程序。code memory 采用16位地址线编码,可以是在片内,或是片外,大小被限制在64KBx0dx0a 作用:定义常量,如八段数码表或是编程使用的常,在定义时加上code 或明确指明定义的常量保存到code memory(只读)x0dx0a 使用方法:x0dx0a char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};x0dx0a 此关键字的使用方法等同于constx0dx0ax0dx0adata data memory (数据存储区)只能用于声明变量,不能用来声明函数,该区域位于片内,采用8位地址线编码,具有最快的存储速度,但是数量被限制在128byte或更少。x0dx0a 使用方法:x0dx0a unsigned char data fast_variable=0;x0dx0ax0dx0a idata idata memory(数据存储区)只能用于声明变量,不能用来声明函数. 该区域位于片内,采用8位地址线编码,内存大小被限制在256byte或更少。该区域的低地址区与data memory地址一致;高地址区域是52系列在51系列基础上扩展的并与特殊功能寄存器具有相同地址编码的区域。即:data memory是idata memory的一个子集。x0dx0a x0dx0a xdata xdata memory 只能用于声明变量,不能用来声明函数,该区域位于MCUx0dx0a 外部,采用16位地址线进行编码,存储大小被限制在64KB以内。x0dx0a 使用方法:x0dx0a unsigned char xdata count=0;x0dx0ax0dx0apdata pdata memory 只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用8位地址线进行编码。存储大小限制在256byte. 是xdata memory的低256byte。为其子集。x0dx0a 使用方法x0dx0a unsigned char pdata count=0;x0dx0ax0dx0a bdata bdata memory 只能用于声明变量,不能用来声明函数。该区域位于8051内部位数据地址。定义的量保存在内部位地址空间,可用位指令直接读写。x0dx0a 使用方法:x0dx0a unsigned char bdata varab=0x0dx0ax0dx0a 注:有些资料讲,定义字符型变量时,在缺省unsigned 时,字符型变量,默认为无符号,与标准C不同,但我在Keil uVision3中测试的时候发现并非如此。在缺省的情况下默认为有符号。或许在以前的编译器是默认为无符号。所以看到有的资料上面这样讲的时候,要注意一下,不同的编译器或许不同。所以我们在写程序的时候,还是乖乖的把unsigned signed 加上,咱也别偷这个懒。x0dx0a 2函数的参数和局部变量的存储模式x0dx0a C51 编译器允许采用三种存储器模式:SMALL,COMPACT 和LARGE。一个函数的存储器模式确定了函数的参数的局部变量在内存中的地址空间。处于SMALL模式下的函数参数和局部变量位于8051单片机内部RAM中,处于COMPACT和LARGE模式下的函数参数和局部变量则使用单片机外部RAM。在定义一个函数时可以明确指定该函数的存储器模式。方法是在形参表列的后面加上一存储模式。x0dx0a x0dx0a 示例如下:x0dx0a #pragma large //此预编译必须放在所有头文前面x0dx0a int func0(char x,y) small;x0dx0a char func1(int x) large;x0dx0a int func2(char x);x0dx0a 注:x0dx0a 上面例子在第一行用了一个预编译命令#pragma 它的意思是告诉c51编译器在对程序进行编译时,按该预编译命令后面给出的编译控制指令LARGE进行编译,即本例程序编译时的默认存储模式为LARGE.随后定义了三个函数,第一个定义为SMALL存储模式,第二个函数定义为LARGE第三个函数未指定,在用C51进行编译时,只有最后一个函数按LARGE存储器模式处理,其它则分别按它们各自指定的存储器模式处理。x0dx0a 本例说明,C51编译器允许采用所谓的存储器混合模式,即允许在一个程序中将一些函数使用一种存储模式,而其它一些则按另一种存储器模式,采用存储器混合模式编程,可以充分利用8051系列单片机中有限的存储器空间,同时还可以加快程序的执行速度。x0dx0ax0dx0a3绝对地址访问 absacc.h(相当重要)x0dx0ax0dx0a#define CBYTE ((unsigned char volatile code *) 0)x0dx0a#define DBYTE ((unsigned char volatile data *) 0)x0dx0a#define PBYTE ((unsigned char volatile pdata *) 0)x0dx0a#define XBYTE ((unsigned char volatile xdata *) 0)x0dx0a 功能:CBYTE 寻址 CODE区x0dx0a DBYTE 寻址 DATA区x0dx0a PBYTE 寻址 XDATA(低256)区x0dx0a XBYTE 寻址 XDATA区x0dx0a 例: 如下指令在对外部存储器区域访问地址0x1000x0dx0a xvar=XBYTE[0x1000];x0dx0a XBYTE[0x1000]=20;x0dx0ax0dx0a#define CWORD ((unsigned int volatile code *) 0)x0dx0a#define DWORD ((unsigned int volatile data *) 0)x0dx0a#define PWORD ((unsigned int volatile pdata *) 0)x0dx0a#define XWORD ((unsigned int volatile xdata *) 0)x0dx0ax0dx0a 功能:与前面的一个宏相似,只是它们指定的数据类型为unsigned int .。x0dx0a 通过灵活运用不同的数据类型,所有的8051地址空间都是可以进行访问。x0dx0a 如x0dx0aDWORD[0x0004]=0x12F8;x0dx0a即内部数据存储器中(0x08)=0x12; (0x09)=0xF8x0dx0ax0dx0a注:用以上八个函数,可以完成对单片机内部任意ROM和RAM进行访问,非常方便。还有一种方法,那就是用指钟,后面会对C51的指针有详细的介绍。x0dx0ax0dx0a4寄存器变量(register)x0dx0a 为了提高程序的执行效率,C语言允许将一些频率最高的那些变量,定义为能够直接使用硬件寄存器的所谓的寄存器变量。定义一个变量时,在变量类型名前冠以“register” 即将该变量定义成为了寄存器变量。寄存器变量可以认为是一自动变量的一种。有效作用范围也自动变量相同。由于计算机寄存器中寄存器是有限的。不能将所有变量都定义成为寄存器变量,通常在程序中定义寄存器变量时,只是给编译器一个建议,该变量是否真正成为寄存器变量,要由编译器根据实际情况来确定。另一方面,C51编译器能够识别程序中使用频率最高的变量,在可能的情况下,即使程序中并未将该变量定义为寄存器变量,编译器也会自动将其作为寄存器变量处理。被定义的变量是否真正能成为寄存器变量,最终是由编译器决定的。x0dx0ax0dx0a5内存访问杂谈x0dx0a 1指钟x0dx0a指钟本身是一个变量,其中存放的内容是变量的地址,也即特定的数据。8051的地址是16位的,所以指针变量本身占用两个存储单元。指针的说明与变量的说明类似,仅在指针名前加上“*”即可。x0dx0a 如 int *int_point; 声明一个整型指针x0dx0a char *char_point; 声明一个字符型指针x0dx0a 利用指针可以间接存取变量。实现这一点要用到两个特殊运算符x0dx0a & 取变量地址x0dx0a * 取指针指向单元的数据x0dx0ax0dx0a示例一:x0dx0aint a,b;x0dx0a int *int_point; //定义一个指向整型变量的指针x0dx0a a=15;x0dx0a int_point=&a; //int_point指向 ax0dx0a *int_point=5; //给int_point指向的变量a 赋值5 等同于a=5; x0dx0a示例二:x0dx0a char i,table[6],*char_point;x0dx0a char_point=table;x0dx0a for(i=0;i<6;i++)x0dx0a {x0dx0a char_point=i;x0dx0a char_point++;x0dx0a}x0dx0a注:x0dx0a 指针可以进行运算,它可以与整数进行加减运算(移动指针)。但要注意,移动指针后,其地址的增减量是随指针类型而异的,如,浮点指针进行自增后,其内部将在原有的基础上加4,而字符指针当进生自增的时候,其内容将加1。原因是浮点数,占4个内存单元,而字符占一个字节。x0dx0ax0dx0a宏晶科技最新一代STC12C5A360S2系列,每一个单片机出厂时都有全球唯一身份证号码(ID号),用户可以在单片机上电后读取内部RAM单元F1H~F7H的数值,来获取此单片机的唯一身份证号码。使用MOV @Ri 指令来读取。下面介绍C51 获取方法:x0dx0a char id[7]={0};x0dx0a char i;x0dx0a char idata *point;x0dx0a for(i=0;i<7;i++)x0dx0a {x0dx0a id[i]=*point;x0dx0a point++;x0dx0a}x0dx0a x0dx0a(此处只是对指针做一个小的介绍,达到访问内部任何空间的方式,后述有对指针使用的详细介绍)x0dx0a2对SFR,RAM ,ROM的直接存取x0dx0aC51提供了一组可以直接对其操作的扩展函数x0dx0a若源程序中,用#include包含头文件,io51.h 后,就可以在扩展函数中使用特殊功能寄存器的地址名,以增强程序的可读性:x0dx0ax0dx0a 注 此方法对SFR,RAM,ROM的直接存取不建议使用.因为,淡io51.h这个头文件在KEIL中无法打开,可用指针,或是采用absacc.h头文件,

9. 51单片机中断寄存器使用注意的问题

首先介绍一下51的寄存器组: 通过设置PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原寄存器组的数据不被中断里的语句破坏,很方便。 RS1RS0 字节地址 000组寄存器00H~07H 011组寄存器08H~0FH 102组寄存器10H~17H 113组寄存器18H~1FH RS1=PSW.4RS0=PSW.3 常见错误有三种: 1、为中断函数指定了第0组寄存器 C程序:voidint0()interrupt0using0 编译后的汇编如下: PUSHACC PUSHB PUSHDPH PUSHDPL PUSHPSW MOVPSW,#0x00 。。。。。。 因为main()函数使用的就是第0组寄存器,中断程序会改变寄存器组的数据。主程序运行时,随时都有可能产生中断,等中断返回主程序时,寄存器R0-R7的值已经被改变了。这是非常严重的错误。而且故障时有时无,错误也是莫明其妙。 2、中断优先级不同,寄存器组号相同 C程序:voidint0()interrupt0using1//低优先级中断 voidT0()interrupt1using1//高优先级中断 因为高优先级的中断可以打断正在执行的低级中断,转向持行高级中断。这就是所谓的中断的中断。与第1种错语一样,高级中断的程序,会改变低级中断正在使用的寄存器。 3、不写using。严格的说,这样写不能算是错误。但这是相当不好的习惯。 C程序:voidint0()interrupt0 编译后的汇编如下: PUSHACC PUSHB PUSHDPH PUSHDPL PUSHPSW MOV PSW,#0x00 PUSH0x00 PUSH0x01 PUSH0x02 PUSH0x03 PUSH0x04 PUSH0x05 PUSH0x06 PUSH0x07 。。。。。。 没用using指定寄存器组,编译器就默认分配了第0组寄存器,然后又用8条语句把第0组的R0-R7保存到栈中,退出中断时还需要8个弹栈。这样“笨拙”的写法,占用了程序空间32个字节、占有堆栈8个字节。也许高级版本的编译器会改进吧,搞单片机的还是规矩些好。 经验总结: 1、写中断程序一定要用using语句指定寄存器组。第1、2、3组都可以,不能是0. 2、51单片机的中断有两个优先级。一个中断不会打断另一个相同优先级的中断。这样相同级别中断可以使用同一个组。比如:低优先级的中断函数都用using1,高优先级的中断都用using2。这样不会冲突。 下面是一个正常的例子: C程序:voidint0()interrupt0using1 编译后的汇编如下: PUSHACC PUSHB PUSHDPH PUSHDPL PUSHPSW MOV PSW,#0x08 。。。。。。

10. 单片机内部基本原理 bin文件如何跑起来 编译器做了什么

无论是单片机还是cpu内部主要有三种部件 ALU 控制器 寄存器。

这个要从编译器开始讲起,编译器会给你编写的软件增加一个头部,无论是MDK还是IAR等等,这个头部是做了什么工作那?头部主要利用单片机寄存器上电后从FLASH将全局变量以及全局未初始化变量搬移倒RAM,增加堆栈 复位 中断向量表 才开始从flash读取你编写的程序,因为编译器已经把程序整个编码为机器码放在flash,有不太了解机器码的可以再去了解,机器码主要是运算加减搬移的那些操作,只不过单片机它就认识了。

单片机内部的控制器读取flash的机器码,通过内部R0-R15做数据中转和RAM交换数据,通过ALU做运算,ALU非常擅长做逻辑的运算,寄存器是存放需要暂存处理的数据,使得它跑了起来。

编译器----编译器的程序----bin文件----机器码----运行

阅读全文

与寄存器编译器相关的资料

热点内容
鬼王镜奴的古装电影 浏览:34
python3module 浏览:497
韩国李彩谭作品 浏览:930
python爬虫gif 浏览:861
重生收母 浏览:539
都市之开局被10个老婆宠成 浏览:233
程序员两年应该多少工资 浏览:964
极盗者2在线免费观看 浏览:854
男男电影免费观看推荐 浏览:361
福建u盘加密联系方式 浏览:516
釜山行3免费完整观看国语 浏览:78
官神夏想几个老婆 浏览:249
看片网站知乎 浏览:60
张鸣pdf 浏览:172
王者区苹果怎么转安卓 浏览:77
蛇的电影免费的完整版 浏览:30
哈萨克 电影 浏览:986
少女大尺度电影禁片 浏览:210
python列表get的用法 浏览:832
安卓平板如何用外接键盘玩游戏 浏览:289