大坡3D软件开发

因我而不同--用软件来改变世界

排序:
默认
按更新时间
按访问量

在Visual C++ 2012(MSVC)编译SDCC编译器

当你想使用一个开源的工具来开发单片机51程序时,可以使用SDCC编译器,它不仅是免费的,还是开放源码的编译器;不仅让你可以开发51的程序,还可以深入了解编译原理的编译器。通过本文的指导,你可以实现自己编译一个51编译器出来,也可以继续深入地了解编译器的原理作为基础。 为了下载SDCC编译器的源码,...

2015-12-03 16:28:42

阅读数:2568

评论数:4

LCC编译器的源程序分析(69)全局变量的初始化

前面已经介绍了全局函数和全局变量的声明处理,但全局变量的初始化,还没有详细地分析,现在就来干这件事情。比如编写C的程序,有如下的代码:#001 #002 int g_nTest = 100;#003 #004 int main(void)#005 {#006  int nTest1 = 1;#00...

2007-08-31 22:07:00

阅读数:5015

评论数:5

LCC编译器的源程序分析(68)内存分配链表

LCC采用大块内存的方法,那它分配内存也是比较特殊的,它的源程序如下:#001 //大块内存结构。#002 struct block#003 {#004     struct block *next; //后继块指针。#005     char *limit; //尾位置#006     char...

2007-08-26 11:35:00

阅读数:4068

评论数:1

LCC编译器的源程序分析(67)删除内存链表

LCC的内存分配是使用先分配大块内存,然后再从大块内存里分配出来小块内存,这样减少调用malloc的次数,当然也就减少调用函数free释放内存的次数,以便提高LCC的内存管理的性能。有网友对这个看不懂,我现在就把释放内存函数分析如下: #001 //#002 //删除内存链表.#003 //#00...

2007-08-23 21:50:00

阅读数:4335

评论数:3

LCC编译器的源程序分析(66)DAG树分析例子

前面已经介绍创建分析树,下面就来详细地说明一个例子,看看到底生成什么样的分析树,C源程序如下:#005  int nTest1 = 1;#006  int nTest2 = 2;#007  int nTest3;#008  int i;#009  #010  nTest3 = nTest1 + n...

2007-08-13 22:47:00

阅读数:4677

评论数:0

LCC编译器的源程序分析(65)后端接口的结构注释

因为LCC后端可以生成不同机器结构的代码,所以需要定义后端的接口结构,当不同的模块实现这些接口时,就可以实现不同的机器代码生成。下面就是这个接口的结构定义注释。 #001 //后端代码生成的接口.#002  typedef struct interface #003 {#004  //数据类型.#...

2007-08-11 19:20:00

阅读数:4111

评论数:0

LCC编译器的源程序分析(64)符号表的结构注释

符号表是用来保存每个符号信息的,因为编译器分析源程序的过程会生成很多符号的属性,后端根据这些属性来生成合适的指令和代码的格式。 #001 //符号表结构.#002 //#003 //蔡军生 2007/08/10 QQ:9073204#004 //#005 struct symbol #006 {#...

2007-08-10 21:32:00

阅读数:3834

评论数:0

LCC编译器的源程序分析(63)创建DAG森林的源程序

#001 //#002 void walk(Tree tp, int tlab, int flab) #003 {#004  //创建DAG森林.#005  listnodes(tp, tlab, flab);#006 #007  //如果DAG森林生成.#008  if (forest) #00...

2007-08-09 21:55:00

阅读数:4374

评论数:4

LCC编译器的源程序分析(62)生成常量树节点的流程

在LCC里分析下面的语句:#005  int nTest1 = 1;就需要把1生成一个常量树节点,那么在LCC里用怎么样的流程来创建这个树节点的呢?这个过程大体是这样的:当碰到赋值符号后,就需要分析表达式,于是调用函数获取记号函数CCaiCompiler::Instance()->GetLe...

2007-08-07 21:45:00

阅读数:3242

评论数:0

LCC编译器的源程序分析(61)复合语句的代码块流程

LCC编译器要分析下面的程序,大体流程是这样的。#001 #include #002 #003 int main(void)#004 {#005  int nTest1 = 1;#006  int nTest2 = 2;#007  int nTest3;#008  int i;#009  #010...

2007-08-03 20:39:00

阅读数:3463

评论数:0

LCC编译器的源程序分析(60)代码表的结构

在LCC里使用代码表来表示代码块,前端把所有代码属性放到代码表里,后端根据代码表来生成代码,它的结构如下:#001 //代码表结构定义.#002 //蔡军生 2007/07/27#003 struct code#004 {#005     //代码表的类型.#006     enum KindTy...

2007-07-27 23:10:00

阅读数:3944

评论数:0

LCC编译器的源程序分析(59)代码生成的源程序注释

下面详细地注释了gen.c的源程序,这样看起来就比较容易理解,希望对你有所帮助。#001 #include "c.h"#002 #003 static char rcsid[] = "$Id: gen.c 355 2007-02-18 22:08:49Z drh $&...

2007-07-22 17:18:00

阅读数:4786

评论数:0

LCC编译器的源程序分析(58)后端使用的节点结构

 在LCC编译器后端,主要使用下面的节点结构来标识代码属性。#001 #002 //节点注释的扩展,主要是代码生成使用。#003 //#004 //蔡军生 2007/07/21 QQ: 9073204#005 //#006 typedef struct {#007     unsigned lis...

2007-07-21 21:29:00

阅读数:3768

评论数:0

LCC编译器的源程序分析(57)不同目标代码生成的接口结构

LCC为了生成不同机器的目标代码,它提供了一个接口给后端的代码生成,以便可以只修改后端,就可以达到生成不同的机器代码。它的接口如下:#001 //后端代码生成接口,可以写生成不同的目标代码。#002 //#003 //蔡军生 2007/07/20 QQ: 9073204#004 //#005 ty...

2007-07-20 21:00:00

阅读数:3695

评论数:0

LCC编译器的源程序分析(56)寄存器分配的属性结构

现在详细地分析寄存器分配的属性结构,它的定义如下:#001 typedef struct {#002     Symbol vbl; //保存变量符号,而不是临时变量.#003     short set; //寄存器类型,比如整数,或者浮点数。#004     short number; //寄...

2007-07-17 22:15:00

阅读数:3517

评论数:0

LCC编译器的源程序分析(55)最终代码的生成

上次已经说明了怎么样选择合适的指令,现在就来介绍生成最终的代码,如下:#010 mov dword [ebp + -12], 1其实生成上面的代码是通过后面的语句来构造出来的,它的过程如下:ASGNI4(ADDRLP4(nTest1), CNSTI4(1))stmt: ASGNI4(addr,rc...

2007-07-16 21:41:00

阅读数:3456

评论数:0

LCC编译器的源程序分析(54)指令模式匹配

在LCC编译器里,先把下面的语句翻译成中间表示,int nTest1 = 1;其中间表示的树如下:ASGNI4(ADDRLP4(nTest1), CNSTI4(1))然后根据上述的中间表示进行指令模式匹配。下面的函数_label就是进行这样的工作:#001 static void _label(N...

2007-07-14 19:29:00

阅读数:3062

评论数:0

LCC编译器的源程序分析(53)指令的选择

像下面的语句:int nTest1 = 1;选择什么样的汇编指令生成的呢?又是怎么样去选择指令的呢?在本例子里,LCC是选择下面的指令生成的:#010 mov dword [ebp + -12], 1 现在就来分析选择指令过程的代码,先分析函数gen的代码:#001 Node gen(Node f...

2007-07-11 19:57:00

阅读数:3297

评论数:0

LCC编译器的源程序分析(52)寄存器溢出

当寄存器分配完了,但又有一些指令需要寄存器,那么就需要把占用寄存器的值保存到内存里,才可以重新分配那些寄存器。下面就来分析LCC的寄存溢出算法。spillee是用来计算那个寄存器最好保存到内存里,然后重新使用的。它的代码如下:#001 static Symbol spillee(Symbol se...

2007-07-09 21:30:00

阅读数:5350

评论数:1

LCC编译器的源程序分析(51) 分配一个寄存器

分配一个寄存器的函数是ralloc,它会调用getreg函数来获取一个寄存器。下面先来分析函数ralloc的代码,如下:#001 static void ralloc(Node p) {#002  int i;#003  unsigned mask[2];#004 #005  mask[0] = ...

2007-07-06 21:17:00

阅读数:6194

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭