没有合适的资源?快使用搜索试试~ 我知道了~
LCC编译器的源码分析

温馨提示


试读
64页
LCC编译器的源程序分析。包含LCC词法分析,语法分析,语义分析,中间代码生成等
资源推荐
资源详情
资源评论







LCC 编译器的源程序分析
(摘自:http://blog.csdn.net/caimouse)
LCC 编译器的源程序分析.............................................................................................................................................1
LCC 编译器的源程序分析(1)C 编译器的目标..............................................................................................................2
LCC 编译器的源程序分析(2)LCC 编译器的预处理.....................................................................................................4
LCC 编译器的源程序分析(3)选择不同的目标代码接口..............................................................................................7
LCC 编译器的源程序分析(4)处理文件参数................................................................................................................10
LCC 编译器的源程序分析(5)行号同步与类型初始化................................................................................................14
LCC 编译器的源程序分析(6)词法分析........................................................................................................................20
LCC 编译器的源程序分析(7)词法分析........................................................................................................................22
LCC 编译器的源程序分析(8)语法分析的开始............................................................................................................33
LCC 编译器的源程序分析(9)声明分析........................................................................................................................39
LCC 编译器的源程序分析(10)声明类型......................................................................................................................45
LCC 编译器的源程序分析(11)声明与符号表..............................................................................................................49
LCC 编译器的源程序分析(12)自定义类型的声明......................................................................................................52
LCC 编译器的源程序分析(13)指针类型的声明..........................................................................................................54
LCC 编译器的源程序分析(14)结构类型的声明..........................................................................................................56
LCC 编译器的源程序分析(15)结构类型成员的声明..................................................................................................59
LCC 编译器的源程序分析(16)函数的声明..................................................................................................................63
LCC 编译器的源程序分析(17)参数变量的声明..........................................................................................................67
LCC 编译器的源程序分析(18)函数定义......................................................................................................................69
LCC 编译器的源程序分析(19)全局函数的定义..........................................................................................................76
LCC 编译器的源程序分析(20)复合语句......................................................................................................................79
LCC 编译器的源程序分析(21)局部变量的声明..........................................................................................................83
LCC 编译器的源程序分析(22)基本表达式..................................................................................................................88
LCC 编译器的源程序分析(23)一元运算表达式..........................................................................................................91
LCC 编译器的源程序分析(24)条件表达式..................................................................................................................96
LCC 编译器的源程序分析(25)赋值表达式..................................................................................................................97
LCC 编译器的源程序分析(26)逗号表达式..................................................................................................................98
LCC 编译器的源程序分析(27)基本语句......................................................................................................................99
LCC 编译器的源程序分析(28)函数表达式语句........................................................................................................106
LCC 编译器的源程序分析(29)if 条件语句.................................................................................................................111
LCC 编译器的源程序分析(30)while 循环语句..........................................................................................................113
LCC 编译器的源程序分析(31)do while 循环语句.....................................................................................................114
LCC 编译器的源程序分析(32)for 循环语句..............................................................................................................115
LCC 编译器的源程序分析(33)break 语句..................................................................................................................117
LCC 编译器的源程序分析(34)continue 语句.............................................................................................................118
LCC 编译器的源程序分析(35)switch 语句.................................................................................................................119
LCC 编译器的源程序分析(36)case 语句....................................................................................................................122
LCC 编译器的源程序分析(37)default 语句................................................................................................................123
LCC 编译器的源程序分析(38)return 语句.................................................................................................................123
LCC 编译器的源程序分析(39)goto 语句....................................................................................................................125
LCC 编译器的源程序分析(40)赋值表达式树............................................................................................................126
LCC 编译器的源程序分析(41)赋值表达式的有向无环图........................................................................................128
LCC 编译器的源程序分析(42)赋值表达式的有向无环图........................................................................................130
LCC 编译器的源程序分析(43)赋值表达式的有向无环图........................................................................................132
LCC 编译器的源程序分析(44)函数名称的代码生成................................................................................................133
LCC 编译器的源程序分析(45)函数代码入口和出口的代码生成.............................................................................134
LCC 编译器的源程序分析(46)计算需要使用栈大小................................................................................................137
LCC 编译器的源程序分析(47)计算需要使用栈大小................................................................................................139
LCC 编译器的源程序分析(48) 寄存器分配...............................................................................................................140

LCC 编译器的源程序分析(49) 寄存器分配...............................................................................................................141
LCC 编译器的源程序分析(50) 分配一个寄存器.......................................................................................................141
LCC 编译器的源程序分析(51) 分配一个寄存器.......................................................................................................143
LCC 编译器的源程序分析(52)寄存器溢出................................................................................................................144
LCC 编译器的源程序分析(53)指令的选择................................................................................................................147
LCC 编译器的源程序分析(54)指令模式匹配............................................................................................................148
LCC 编译器的源程序分析(55)最终代码的生成........................................................................................................153
LCC 编译器的源程序分析(56)寄存器分配的属性结构............................................................................................154
LCC 编译器的源程序分析(57)不同目标代码生成的接口结构................................................................................155
LCC 编译器的源程序分析(58)后端使用的节点结构................................................................................................157
LCC 编译器的源程序分析(59)代码生成的源程序注释............................................................................................157
LCC 编译器的源程序分析(60)代码表的结构............................................................................................................187
LCC 编译器的源程序分析(61)复合语句的代码块流程............................................................................................189
LCC 编译器的源程序分析(62)生成常量树节点的流程............................................................................................190
LCC 编译器的源程序分析(63)创建 DAG 森林的源程序..........................................................................................190
LCC 编译器的源程序分析(64)符号表的结构注释....................................................................................................191
LCC 编译器的源程序分析(65)后端接口的结构注释................................................................................................193
LCC 编译器的源程序分析(66)DAG 树分析例子.......................................................................................................195
LCC 编译器的源程序分析(67)删除内存链表............................................................................................................196
LCC 编译器的源程序分析(68)内存分配链表............................................................................................................196
LCC 编译器的源程序分析(69)全局变量的初始化....................................................................................................199
LCC 编译器的源程序分析(1)C 编译器的目标
先从简单的目标来分析这个大规模的 C 编译器,毕竟它的功能比较复杂,并且源程序的行
数也是非常多的。因此,把简单的目标定出来,然后再分析它,这样才会有的放矢。接着
再跟着编译运行的主线来分析它的源程序。下面先看一下简单的 C 例子,如下:
#001 #include <stdio.h>
#002
#003 int main(void)
#004 {
#005 int nTest1 = 1;
#006 int nTest2 = 2;
!
"#
$$%&'$$$$()'$$*++,+
#019 return 0;

#020 }
#021
上面的程序就是用来说明编译器工作的例子,它在第一行里包含了头文件stdio.h,由于后
面调用printf函数输出显示到屏幕里。第二行空行,第三行是main函数,它是C程序的入口
函数。在main函数里,定义了几个局部变量,分别第5,6,7,8行的变量。第10行作两
个变量nTest1和nTest2的加法,然后赋值给变量nTest3。第11行显示变量nTest3的值,是
用10进制输出显示。在第13到16行是5次输出nTest3+i值。在第18行里输出编译这个程序
的时间和hello world的字符串。
C编译器的任务,就是把上面的源程序变换到汇编代码输出,或者变成其它中间代码输出。
在这里LCC编译器是输出汇编代码的,所以就不介绍其它的中间代码输出。那么LCC把上
面的源程序变成什么样的汇编输出呢?下面就先把它的目标代码看一下,如下:
-.+/0+1203
-4563
1207
8*/6
8*
"8*
8*/
29/
8/"
29,-/:3
29,-/:"3
29,-/:3
29,-/:"3
+0-3
29,-/:3
"29,-/:3
8*,
+0-1;3
8*,
40++1
0
29,-/: 3
1;7
29,-/:3
29,-/: 3
"+0-3
8*,
+0-1;3
8*,
40++1
0
1; 7
4,-/: 3
42,-/: 3

<+01;
"+0-1;3
8*,
40++1
0
2906
1;7
29/
/
"/6
-613
-45003
21:11=
1;7
/>77)>>*++,+>
21:11=
1;7
/>>
"21:11=
1;7
/>>
#059
LCC是可以生成很多目标代码的C编译器,在这里主要介绍生成X86的NASM汇编的代码。
上面的汇编代码就是NASM的汇编格式,可以使用NASM编译生成目标文件,然后再用连
接程序生成可执行文件。如果不能看懂上面的NASM汇编,就需要去看NASM手册了,这
个手册在网上有下载。如果想更深入理解汇编生成机器码的过程,当然也可以深入分析NA
SM的程序实现。
从上面的C和汇编也可以看出,汇编代码比C代码要复杂,行数也比较多,还分了数据段和
代码段。所以使用C编译器是可以大大地提高生产效率的,并且更容易理解,这样就容易
降低软件的成本,容易开发大规模的软件工程。
LCC 编译器的源程序分析(2)LCC 编译器的预处理
上面已经介绍了 C 编译器的目标,其实在实现这个目标之前,是经历了很多阶段处理的,其中第一个阶段的
处理,就是预处理。预处理的任务是做什么呢?在 LCC 里预处理主要是把所有包含的头文件和源程序生成一
个中间文件,并且把所有宏展开,替换为真实的值。前面介绍的例子源程序,经过预处理后,就会生成下面的
代码,如下:
#line 1 "hello.c"
#line 1 "include/stdio.h"
typedef unsigned int size_t;
typedef unsigned short wchar_t;
typedef wchar_t wint_t;
typedef wchar_t wctype_t;
typedef char * va_list;
#line 39 "include/stdio.h"
struct _iobuf {

char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
extern FILE *_iob;
typedef long fpos_t;
extern FILE (*__imp__iob)[];
int _filbuf(FILE *);
int flsbuf(int, FILE *);
FILE * _fsopen(const char *, const char *, int);
void clearerr(FILE *);
int fclose(FILE *);
int _fcloseall(void);
FILE * fdopen(int, const char *);
int feof(FILE *);
int ferror(FILE *);
int fflush(FILE *);
int fgetc(FILE *);
wchar_t fgetwc(FILE *);
wchar_t getwc(FILE *);
int _fgetchar(void);
int fgetpos(FILE *, fpos_t *);
char * fgets(char *, int, FILE *);
int fileno(FILE *);
int _flushall(void);
FILE * fopen(const char *, const char *);
int fprintf(FILE *, const char *, ...);
int xfprintf(FILE *,const char *,...);
int fputc(int, FILE *);
int _fputchar(int);
int fputs(const char *, FILE *);
size_t fread(void *, size_t, size_t, FILE *);
FILE * freopen(const char *, const char *, FILE *);
int fscanf(FILE *, const char *, ...);
int xfscanf(FILE *,const char *,...);
int fsetpos(FILE *, const fpos_t *);
int fseek(FILE *, long, int);
long ftell(FILE *);
size_t fwrite(const void *, size_t, size_t, FILE *);
int getc(FILE *);
int getchar(void);
char * gets(char *);
int getw(FILE *);
int _pclose(FILE *);
FILE * popen(const char *, const char *);
int printf(const char *, ...);
int xprintf(const char *,...);
剩余63页未读,继续阅读

oddstar78
- 粉丝: 2
- 资源: 20
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于微信小程序的图书管理系统(服务端+小程序端)源码
- 壁纸_1.8.8_仅支持安卓13(公众号@极客geeking持续更新).apk
- 打外星人小游戏,运用pygame来实现打外星人小游戏
- Stress-Test-Driven Qualification of Integrated Circuits JESD47K
- 手机工具-华为一键解锁工具
- URP Shadow Receicer Shader
- 自定义改版UnityExcel插件
- Requirements for Handling ESDS Devices 防静电
- 1701165601027174_wireshark-4.2.0.tar.xz
- magiskmanager-5.8.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
前往页