大坡3D软件开发

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

LCC编译器的源程序分析(47)计算需要使用栈大小

计算栈的大小,是通过后端接口的代码来完成计算的。栈的大小,主要就是局部变量、临时变量、调用参数和返回值等使用的字节大小,如果变量可以放到寄存器,就不需加到栈的大小里。上面已经看了下面的代码:#044          case Blockbeg: #045                {#046...

2007-06-28 22:55:00

阅读数:3190

评论数:0

LCC编译器的源程序分析(46)计算需要使用栈大小

从目标代码里,可以看到下面一行:#009 sub esp, 16在这行里是保留栈的大小,值为16。但16个字节是怎么样计算出来的呢?下面就来分析LCC的代码,看它是怎么样计算的。它是在函数gencode里进行计算的,它的代码如下:#001 void gencode(Symbol caller[],...

2007-06-27 21:56:00

阅读数:2992

评论数:2

LCC编译器的源程序分析(45)函数代码入口和出口的代码生成

由于C语言可以动态地分配局部变量,因此它的运行环境都是基于栈式的分配来实现的,所以在函数的入口就会生成一段分配栈的代码,如下:#002 [section .text]#003 $main:#004 push ebx#005 push esi#006 push edi#007  push ebp#0...

2007-06-23 21:17:00

阅读数:3622

评论数:0

LCC编译器的源程序分析(44)函数名称的代码生成

当把所有的源程序生成DAG表示后,就进入了编译器的最后处理阶段,LCC是把DAG生成汇编的目标代码。在这一阶段,编译器为源程序定义和使用的变量选择存储单元,并把中间指令翻译成完成相同任务的汇编代码指令序列。在代码生成里,需要处理的问题是存储管理、指令选择、寄存器分配、计算次序等等。在第一节里就已经...

2007-06-22 21:42:00

阅读数:2911

评论数:0

LCC编译器的源程序分析(43)赋值表达式的有向无环图

由于INDIR树与ADDRL树的类型相同,所以已经转换为ADDRL树,直接对ADDRL树进行进访问了,下面就是在函数listnodes里处理赋值表达式的ADDRL树,它的代码如下:#412  case ADDRL: #413         { #414               assert(...

2007-06-21 23:08:00

阅读数:2775

评论数:0

LCC编译器的源程序分析(42)赋值表达式的有向无环图

 上一次说到赋值表达式转换为有向无环图的函数listnodes,下面继续来分析这个函数代码。当赋值树处理时,就运行下面的分支来处理:#256  case ASGN: #257         { #258               assert(tlab == 0 && flab...

2007-06-20 23:13:00

阅读数:2834

评论数:0

LCC编译器的源程序分析(41)赋值表达式的有向无环图

前面已经介绍怎么样把赋值表达式变换到树的中间表示,接着下来编译器要做的事情就是怎么样把树变换成有向无环图。也许你会问为什么要把树变换成有向无环图,而不是直接生成最终代码呢?其实,学习过数据结构就很清楚有向无环图的应用,编译器里就是利用有向无环图的特性来进行局部代码优化的,最主要的优化就是删除公共表...

2007-06-19 23:55:00

阅读数:3918

评论数:2

LCC编译器的源程序分析(40)赋值表达式树

前面分析了表达式的语法,也分析了语句的语法,但它们最终的目的就是生成合适的中间表示,在LCC里是采用树作为中间表示的。现在就来分析语句生成什么样的树表示,下面的语句是来自例子里,如下:int nTest1 = 1;这个语句是声明了一个局部变量nTest1,并且给nTest1赋值为1。LCC编译器要...

2007-06-18 22:26:00

阅读数:3011

评论数:0

在VC2005里使用STLPORT

听说STLPORT的性能不错,心动不如行动,立即就上网下载STLPORT下来使用,先到下面的网址下载源程序:http://nchc.dl.sourceforge.net/sourceforge/stlport/STLport-5.1.3.zip这个压缩包不是很大,才1.6M,很轻松地就下载完成了。...

2007-06-18 13:56:00

阅读数:3775

评论数:1

LCC编译器的源程序分析(39)goto语句

在现代设计的程序里,很少再用到goto语句了。虽然使用goto语句是比较高效,但它使程序也会得非常难懂,非常难维护,比较容易出错,所以很少使用goto语句的。goto语句为无条件跳转语句,它的一般形式为: goto 标号;在LCC里的是用下面的代码来处理:#001 case GOTO:    #0...

2007-06-17 11:23:00

阅读数:2737

评论数:0

LCC编译器的源程序分析(38)return语句

在实现中,程序其实就是处理数据,然后输出处理过的结果,在C语句里最直接的方式就是函数的返回值。比如求两个数据的最大值,就可以通过函数返回值来返回最大值。而函数的返回值是通过函数中的return语句获得的。return语句后面是一个表达式,需要调用表达式函数来处理。下面来分析LCC里的代码:#001...

2007-06-16 20:07:00

阅读数:2985

评论数:0

LCC编译器的源程序分析(37)default语句

default语句是使用在switch语句的复合语句里,它是所有其它分支不能处理时的分支处理。在LCC里是如下处理的: #001 case DEFAULT: #002         if (swp == NULL)#003               error("illegal de...

2007-06-15 21:28:00

阅读数:2647

评论数:0

LCC编译器的源程序分析(36)case语句

case语句是使用在switch语句之中,它实现了选择一个分支执行。当表达式的值与case后面的常量表达式的值相等时,就执行此case语句后面的语句。LCC处理这个语句的代码如下:#001 case CASE:     #002         {#003               int la...

2007-06-14 21:35:00

阅读数:2788

评论数:0

LCC编译器的源程序分析(35)switch语句

switch语句是多分支选择语句,主要方便多个选择的情况使用,当然也可以使用if语句来实现,但嵌套的if语句过多会使用程序的可读性降低。switch(表达式){ case 常量表达式1:       语句1; case 常量表达式2:       语句2; … case 常量表达式n:      ...

2007-06-13 19:04:00

阅读数:2992

评论数:0

LCC编译器的源程序分析(34)continue语句

continue语句的作用是跳过循环体中后面尚未执行的语句,接着进行下一次是否执行循环的判断。比如下面的例子: while(表达式1) {       …       if(表达式2) continue;       … }下面就来仔细地分析LCC里处理continue语句的源程序:#001 ca...

2007-06-12 21:20:00

阅读数:3200

评论数:0

LCC编译器的源程序分析(33)break语句

break语句可以使用流程跳出switch语句的分支选择,当然它还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。但它不能用于循环语句和switch语句之外的其它语句中。比如下面的例子:for(;;){ if( a++ > 100)       break;} 现在就来...

2007-06-11 21:55:00

阅读数:3085

评论数:0

LCC编译器的源程序分析(32)for循环语句

 C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。因此,这个语句的使用频率是最高的,当然它的处理情况比上面两种循环要复杂一些。它的形式如下: for(表达式1;表达式2;表达式3)       语句1它的执行过程是先求解表...

2007-06-10 14:12:00

阅读数:3069

评论数:1

LCC编译器的源程序分析(31)do while循环语句

do—while语句是实现“直到型”循环结构。一般形式如下:do{  语句1}while(表达式) 上面的语句是这样的执行的,先执行一次语句1,然后判断表达式的值,如果表达式的值为真,也就是非零时,返回重新执行语句1,如此反复,直到表达式的值等于0为止。这个表达式与前面一个while语句的区别,就...

2007-06-09 23:43:00

阅读数:2230

评论数:0

LCC编译器的源程序分析(30)while循环语句

while语句的语义是这样定义的:while(表达式) 语句1当表达式为非0值时执行while语句中的内嵌语句1。其特点就是先判断表达式的值,然后再执行语句。LCC是通过下面的代码来处理这个语句的:#015  case WHILE:    #016         whilestmt(genlab...

2007-06-08 22:08:00

阅读数:2221

评论数:0

LCC编译器的源程序分析(29)if条件语句

if语句是用来判定所给定的条件是否满足,根据判定的结果决定执行给出来的两种操作之一。if语句有下面三种形式:1.             if(表达式)语句2.             if(表达式)语句1 else 语句23.             if(表达式1)语句1 else if(表达...

2007-06-07 21:39:00

阅读数:2778

评论数:0

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