当前课程知识点:编译技术 > 第七章 代码生成 > 7.2 目标机器 > 7.2 目标机器
各位同学大家好
这节课我们继续来学习代码生成
我们来讨论一下
目标机器的指令系统
首先我们选择
可作为几种微机代表的寄存器机器
4个字节组成1个字
我们有n个寄存器
我们使用的指令
是op 源, 目的 这样的形式
比如说
MOV 源传到目的
ADD表示源加到目的
SUB表示目的减去源
我们再来讨论一下地址模式
以及它们汇编语言形式
和它们的附加代价
它们的基本模式
有如下的这几种
首先是绝对地址
我们把它写为M
它表示的地址就是M
访问一个绝对地址需要用的代价是1
第二个是寄存器
我们把它写为R
其中的地址就是R
访问寄存器的速度非常快
所以我们认为它的代价
和一般的绝对地址代价相比
是0
第三行是变址
我们把它写为c(R)
表示的是
从R中取出对应的内容再偏移c的地址
需要的代价是1
下一行是间接寄存器
*R'表示的是取出R当中的内容
花费的代价仍然是0
再下一行是间接变址
*c(R)
表示的是从R中取出内容
偏移c位之后,
再取出对应地址的内容
需要的代价是1
最后对于直接量来说
我们的形式写为#c
表示的地址是c,需要的代价是1
第一行指令
MOV R0, M
我们将R0移动到M中
第二行指令
MOV 4(R0), M
我们将4(R0)中的内容移动到M中
4(R0)的值
表示的是contents(4+contents(R0))
contents(R0)表示R0其中的内容
也就是
我们将R0中的内容取出来
加上偏移的4位之后
再取出对应的内容
第三个指令
MOV *4(R0), M
我们将*4(R0)当中的值移动到M中
*4(R0)它的值表示的是
从R0中取出内容偏移4位之后
作为一个地址
再取出对应的内容
这个内容仍然作为一个地址
再取出对应的内容
最后一条指令
MOV #1, R0
我们取出直接变量1存入到R0中
下面我们来讨论一下指令的代价
指令的代价
我们可以将它计算为
1加上指令的源和
目的地址模式的附加代价
比如说对于第一行指令
MOV R0, R1 它的代价就是1
因为访问R0和R1
这两个寄存器消耗的代价是0
所以整条语句的代价
就是MOV这个指令所需要的代价,也就是1
第二个指令
MOV R5, M 需要的代价是2
第三个语句
ADD #1, R3 需要的代价是2
最后一个指令
SUB 4(R0), *12(R1)
花费的代价是3
接下来我们来讨论一下
多条指令的代价
假设我们有一个计算的式子
a=b+c
假设a、b、c都存放在静态分配的内存单元
那么我们可以将a=b+c生成对应的指令
MOV b, R0
这条指令它的代价是2
ADD c, R0 代价是2
MOV R0, a 代价是2
所以这三条语句的代价是6
当然我们也可以将它写为
MOV b, a
这条指令的代价是3
ADD c, a
这条指定的代价也是3
所以这两行指令合在一起
代价仍然为6
接下来假设R0、R1、R2
包含abc的地址
那么我们就可以将它写为
MOV *R1, *R0
这条语句的代价是1
下边 ADD *R2, *R0
这条指令的代价是1
所以这两个指令合在一起
整个的代价是2
当然如果R1和R2分别含有 b和c的值
并且b的值
在这次赋值之后不再使用了
那么
我们也可以写成如下的形式
ADD R2, R1
MOV R1, a
这两条语句的代价是3
这一小节就到这
谢谢大家
-1.1 编译技术绪论
--编译原理介绍--作业
-2.1 词法记号 串和语言
--2.1 词法记号 串和语言--作业
-2.2 正规式 状态转换图
--2.2 正规式 状态转换图--作业
-2.3 有限自动机
--2.3 有限自动机--作业
-2.4 DFA构建 子集构造法 DAF化简
-2.5 Lex
-3.1 上下文无关文法
--3.1.3 推导
-3.2 自上而分析中的文法
--3.2 上下文无关文法--作业
--3.2.3 语言和文法--作业
-3.3 自上而下分析
-3.4 自下而上分析
--3.4 自下而上分析--作业
-3.5 LR分析器
-4.1 语法制导的定义
--4.1 语法制导的定义--作业
-4.2 S属性的自下而上计算
-4.3 L属性定义
--4.3 L属性定义--作业
-4.4 L属性的自下而上计算
--4.4 L属性的自下而上计算--作业
-5.1 概述
--5.1 概述
--概述-作业
-5.2 全局栈式存储分配
-5.3 调用序列
--5.3 调用序列
-5.4 非局部名字的访问
--5.4 非局部名字的访问--作业
-6.1 中间代码生成
-6.2 作用域信息的保存
-7.1 代码生成器设计中的问题
-7.2 目标机器
--7.2 目标机器
--7.2 目标机器--作业
-7.3 基本块和流图
-7.4 一个简单的代码生成器
-8.1 基于Python的编译器框架演示视频和代码
-8.2 代码介绍
--8.2.4 SA
-8.3 SimpleJava