当前课程知识点:Compilers Techniques > 7 Code Generation > 7.2 Target Machine > 7.2 Target Machine
返回《Compilers Techniques》慕课在线视频课程列表
返回《Compilers Techniques》慕课在线视频列表
各位同学大家好
这节课我们继续来学习代码生成
我们来讨论一下
目标机器的指令系统
首先我们选择
可作为几种微机代表的寄存器机器
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 Overview of Compilers Techniques
--Chapter 1 Overview of Compilers Techniques
--Overview of Compilers Techniques
-2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
-2.2 Regular form
--2.2 Regular form
-2.3 Finite automata
--2.3 Finite automata
-2.4 DFA construction, Subset construction, Simpleset DFA
--2.4 DFA construction, Subset construction, Simpleset DFA
-2.5 Lex
--2.5 Lex
-3.1 Context-free Grammars
--3.1.1 The Role of the Parser
--3.1.2 The Formal Definition of a Context-free Grammar
-3.2 Writing a Grammar
--3.2.1 Elimination of Left Recursion
--3.2 Top-Down Parsing
-3.3 Languages and Grammars
--3.3 Language and Grammars
-3.4 Top-Down Parsing
--3.4.3 Recursive Descent Analysis
--3.4.4 Nonrecursive Descent Analysis
-3.5 Bottom-up Parsing
--Bottom-up Parsing
-3.6 LR Parsing
--3.6.6 Characteristics of LR Parsing
--3.6.7 Non Ambiguous and Not LR Context-Free Grammars
-4.1 Syntax-Directed Definitions
--4.1.2 Attribute Dependency Graphs and Ordering the Evaluation of Attributes
--Syntax-Directed Definitions
-4.2 Bottom-Up Calculation of S Attribute
--4.2.1 Bottom-Up Calculation of S-Attributed
-4.3 L-Attributed Definitions
--4.3.1 L-Attributed Definitions
--4.3.3 Design of Predictive Translator
--L-Attributed Definitions
-4.4 Bottom-Up Parsing of L-Attributed Translation
--4.4.1 Bottom-Up Parsing of L-Attributed Translation
--4.4.2 Simulate the Parsing of Inherited Properties
--Bottom-Up Parsing of L-Attributed Translation
-5.1 Overview
--Overview
-5.2 Global Stack Storage
-5.3 Calling Sequences
-5.4 Non Local Names
--5.4 Non Local Names and dynamic scope
--Non Local Name
-6.1 Overview of Intermediate Code Generation
--6.1 Overview of Intermediate Code Generation
-6.2 Declaration Statements
-7.1 Issues in the Design of Code Generator
--7.1 Issues in the Design of Code Generator
-7.2 Target Machine
--Target Machine
-7.3 Basic Blocks and Flow Graphs
--7.3 Basic Blocks and Flow Graphs
-7.4 A Simple Code Generator
-8.1 Demonstration of Compiler Framework based on Python
--8.1 Demonstration of Compiler Framework based on Python
-8.2 Basic
--8.2.4 SA
-8.3 SimpleJava