【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

lcc编译器是一款开源编译器,和我们之前谈过的ucc差不多。一开始的时候,这款编译器是用来进行教学使用的,但是后来越来越多的人开始了解它、使用它,并且将这款编译器用到实际项目当中。当前一般的用法就是利用lcc将c文件转变成asm汇编文件,这种使用方法是最常见的。如果我们自己开发的程序是单片机软件、或者是其他不需要linux平台运行的单机软件,使用lcc还是很方便的。

当然,不管是ucc还是lcc,一开始这两个编译器还是gcc编译的,后续其实就可以自己编译自己了。

1、代码地址

https://github.com/drh/lcc

2、编译平台

ubuntu16.04

3、编译方法

大家下载好压缩包之后,一般经过这几个步骤就可以开始使用了

shell> unzip lcc-master.zip
shell> cd lcc-master
shell> mkdir output
shell> make BUILDDIR=./output HOSTFILE=etc/linux.c all

4、生成的文件

如果顺利的话,我们会在output目录下面看到这些执行文件,

shell$ ls -l
total 1224
-rwxrwxr-x 1 fxx fxx   27640 10月  3 21:32 bprint
-rwxrwxr-x 1 fxx fxx   86488 10月  3 21:32 cpp
-rwxrwxr-x 1 fxx fxx   50960 10月  3 21:32 lburg
-rwxrwxr-x 1 fxx fxx   42984 10月  3 21:32 lcc
-rwxrwxr-x 1 fxx fxx 1034264 10月  3 21:32 rcc

5、各个文件的作用

bprint主要是打印out文件

cpp是对c文件进行预处理,包括头文件、宏等等

lburg是自动生成cpu后端文件,比如alpha.c、mips.c、x86.c、sparc.c、x86linux.c等等

lcc是驱动器,它负责将rcc生成的asm编译成执行文件,使用的工具是as、ld

rcc就是c编译器

注意:这里的cpp可以直接给其他的c编译器使用,用来进行头文件预处理,十分方便。

6、开始准备编译,可以准备一个简单的文件,比如hello.c

int iteratet(int a)
{if(a == 0)return 0;elsereturn iterate(a-1) +a;
}

7、输入编译的命令

shell> cd output
shell> ./rcc -target=x86/linux hello.c  -o hello.asm

8、打开hello.asm文件

.globl iteratet
.text
.align 16
.type iteratet,@function
iteratet:
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp,%ebp
cmpl $0,20(%ebp)
jne .LC2
mov $0,%eax
jmp .LC1
.LC2:
movl 20(%ebp),%edi
subl $1,%edi
pushl %edi
call iterate
addl $4,%esp
movl %eax,%edi
movl 20(%ebp),%esi
leal (%esi,%edi),%eax
.LC1:
movl %ebp,%esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.Lf4:
.size iteratet,.Lf4-iteratet
.ident "LCC: 4.2"

9、关于lcc的一本书

《A Retargetable C Compiler》

其他:

在读书的时候,编译器就是比较难学的一门课程。工业生产中常用的gcc代码又太大了,不适合学习。因此像lcc这样兼顾学习和工业质量的编译器,其实是很难得。大家可以将它用在自己的工作或者实际产品当中,就像游戏中常用的lua一样。甚至可以对其进行改造,用来做代码越界测试、性能分析测试、安全保护测试,都是大有裨益的。

随想录(lcc编译器)相关推荐

  1. LCC编译器的源程序分析(2)LCC编译器的预处理

    上面已经介绍了 C 编译器的目标,其实在实现这个目标之前,是经历了很多阶段处理的,其中第一个阶段的处理,就是预处理.预处理的任务是做什么呢?在 LCC 里预处理主要是把所有包含的头文件和源程序生成一个 ...

  2. 随想录(编译器是怎么工作的)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 编译器一直是我比较喜欢的话题.编译器是个比较神奇的工具,它可以把原来毫无意义的字符数据转变成一 ...

  3. matlab2013a编译器,如何MATLAB2013a在win8-64位系统上能装mex编译器

    答:#隐藏apache版本信息 sed -i 's/#define AP_SERVER_BASEPRODUCT "Apache"/#define AP_SERVER_BASEPRO ...

  4. lcc源代码详解之介绍

    LCC,全称为"Local C Compiler"或"Little C Compiler",是一个小型自由的ANSI C编译器,源代码开放,由Chris Fra ...

  5. matlab 混合C++编程mex方式初级入门

    matlab混合C++编程有几种方式:mex是其中一种: 新建一个cpp文件如下:函数有四个参数是mex规定的:下面函数功能只是输出hello world!:文件名test.cpp: #include ...

  6. C++和MATLAB混合编程-DLL篇

    先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...

  7. ASPack 2.x (without poly) - Alexey Solodovnikov [Overlay]脱壳

    下载地址:http://files.cnblogs.com/tk091/crackme6.7z 先用peid检测,为ASPack 2.x (without poly) -> Alexey Sol ...

  8. matlab打包多个m文件,MATLAB GUI多个m文件和fig如何生成exe文件

    MATLAB GUI多个m文件和fig如何生成exe文件 方法一: 已有gui.m文件和gui.fig文件 1 在matlab的command窗口中输入 mcc -B sgl GUI.m 2.将上步生 ...

  9. matlab7 fig exe 阴影,Matlab 生成完全独立运行的 EXE文件的问题请教

    如何将matlab gui文件编辑成exe可执行文件 我现在用Matlab M文件写了一个计算程序,当输入一些数时,通过程序,计算出一些结果.(比如我的 程序是sum=(a+b+c)/d,即给定a,b ...

最新文章

  1. [Java基础] 反射机制汇总
  2. 原SUN网站:java.sun.com,developers.sun.com,bigadmin将合并到OTN
  3. Fiori configuration edit also needs enqueue
  4. [vue] 用vue怎么实现一个换肤的功能?
  5. 《Unix/Linux网络日志分析与流量监控》2014年11月底出版
  6. 【原创】Mysql客户端如何处理中文
  7. python作者_Python
  8. Linux实验报告一【 下载配置搜狗安装包16.04】
  9. VM虚拟机浏览器替代软件-VMLogin虚拟多登指纹浏览器,超级浏览器,防关联浏览器
  10. Docker进阶学习(容器数据卷、安装Mysql、DockerFile )
  11. ftp命令上传文件及文件夹
  12. 初学者如何学习好嵌入式开发?讲解嵌入式学习教程
  13. 【零基础学Python】Day10 Python解释器
  14. go语言入门(转载自开源社区)
  15. android 获取wifi连接不上,如何检测无法在android中连接wifi?
  16. C语言中函数的一些基本内容
  17. 决策树(ID3、C4.5、CART、随机森林)
  18. javaScript常用
  19. WebApp网页真机调试工具-(Android)
  20. idea修改代码提示的快捷键

热门文章

  1. 删除某文件以外的文件
  2. react-redux一点就透,我这么笨都懂了!
  3. 《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式
  4. iOS - OC RunLoop 运行循环/消息循环
  5. Js 通过点击改变css样式
  6. 员工的不幸?还是公司的悲哀?
  7. 怎样对待一个延期的项目
  8. discuz常用变量
  9. 网上图书商城项目学习笔记-028编辑一级分类
  10. docfx组件介绍--MarkdownLite