隨想錄(lcc編譯器)

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯繫信箱: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;
        else
                return 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一樣。甚至可以對其進行改造,用來做代碼越界測試、性能分析測試、安全保護測試,都是大有裨益的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章