计算机语言代码生成器,代码生成器,目标语言,目标代码中的地址

代码生成器,目标语言,目标代码中的地址

代码生成器

代码生成器的是生成正确的代码,代码生成器的设计依赖于中间表示形式,目标语言和运行时刻系统的特定细节;

要解决指令选择,寄存器分配和指令排序等问题。

代码生成器的输入

输入由前端生成的源程序的中间表示形式以及符号表中的信息构成

中间语言的表示形式:

三地址表示,如三元式,四元式

虚拟机表示,如字节代码和堆栈机代码

线性表示,如后缀表示

图形表示,如语法树和DAG

目标程序

目标机体系结构:

RISC(精简指令集计算机)

CISC(复杂指令集计算机)

基于堆栈的结构

指令选择

根据IR层次、指令集体系结构本身的特性、想要达到的生成代码质量,来完成IR程序到目标程序的映射。

如果IR是高层次的,代码生成器会根据代码模板生成机器指令序列;但这样生成结果的运行效率很低,需要进一步优化

比如:a=b+c, d=a+e

LD R0, b

ADD R0, R0, c

ST a, R0

LD R0, a

ADD R0, R0, e

ST a, R0

3,4就出现了冗余

寄存器的分配

分解为两个子问题:

寄存器分配:选择一组即将被存入寄存器的变量

寄存器指派:指定一个变量存放到指定寄存器中

目标语言

一个简单的目标机模型

这个目标机的内存按字节寻址,有n个通用寄存器,以下类型的指令

加载: LD dst, src

保存: ST dst, src

计算: OP dst, src1, src2

无条件跳转: BR L

条件跳转: Bcond r, L

寻址方式:

一个位置可以是一个变量名x,它是分配给x的内存位置,也称为x的左值

一个位置可以是形如a(r),即a的左值+寄存器r中的值

一个位置可以是一个寄存器为下标的整数n(r) n+r

*r表示将r的内容作为内存位置,并取出其内容

直接常数寻址

程序和指令的代价

即读取内存的次数

目标代码中的地址

空间划为四个代码及数据区域:code,static,heap,stack

静态分配

将返回地址保存到static

栈分配

和x86,x64,c反汇编原理相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值