前几篇文章讲了gcc的词法分析和宏,下面先来个小应用实例,简单介绍一下后端。
我相信也有不少大神,自己写过虚拟机或者基于fpga实现过cpu,毕竟由那本自制cpu在嘛(笑)。
对于自制的cpu,只能用汇编语言编写代码,那是无论如何也不能忍受的,今天介绍怎么把gcc编译器打包到自制的cpu上,使其支持c和c++。
gcc是一个多前端和多后端的编译器集合,如果能驾驭它,就能把一大堆语言打包到任意机器上面。
是不是爽歪歪啊,如果能得到gcc的支持,哪怕把整个linux系统打包上来都可能。那么我们来看一下gcc后端。
我们从这些后端里面,选择fr30这个后端进行分析,因为它足够简单。
先来介绍几个文件,首先打开fr30.md,这个文件里面定义了目标机器的汇编代码。
这是一种名为lisp的编程语言,被用在gcc后端,用来匹配指令模式的,gcc里面把这个叫rtl(Register Transfer Language),意思为寄存器传送。
lisp是一个前置运算符,且没有优先级的语言,就像这样"(+ 5 6)",计算两个数的相加,他会把括号里面第一个元素作为运算符,后面全部是操作数。
rtl总共有五种数据类型,分别是:
1.表达式
2.整数
3.计算机字,跟寄存器宽度相当
4.字符串
5.向量,使用方括号定义,方括号里面元素可以是任意rtl类型,元素与元素之间使用空格隔开
define_insn定义一条指令,一般格式是:
(define_ins