编译原理实验:目标代码的生成

合集下载

编译原理 编译的过程

编译原理 编译的过程

编译原理编译的过程编译原理是计算机科学与技术领域的一个重要学科,它研究的是将高级程序语言转化为机器语言的过程,以实现程序的运行。

编译的过程可以分为以下几个步骤。

1. 词法分析(Lexical Analysis):将输入的源代码序列划分为一个个的词素(Token),并对每个词素进行分类。

2. 语法分析(Syntactic Analysis):根据语法规则,利用词法分析得到的词法单元序列,生成抽象语法树(Abstract Syntax Tree),以表达程序的结构。

3. 语义分析(Semantic Analysis):对生成的抽象语法树进行语义的验证,包括类型检查、作用域检查等。

同时,将高级语言的语句转化为中间代码表示。

4. 优化(Optimization):对生成的中间代码进行优化,以提高程序的执行效率。

包括常量折叠、公共子表达式消除、循环优化等。

5. 中间代码生成(Intermediate Code Generation):将优化后的中间代码转化为目标机器独立的中间代码表示,如三地址码、虚拟机指令等。

6. 目标代码生成(Code Generation):根据目标机器的特点,将中间代码转化为目标机器代码,如汇编语言代码或机器指令。

7. 目标代码优化(Code Optimization):对生成的目标代码进行优化,以进一步提高程序的执行效率。

8. 目标代码的链接与装载(Linking and Loading):将编译得到的目标代码与库进行链接,生成可执行程序,并将其加载到内存中执行。

编译过程中的每个阶段都具有特定的功能和任务,它们相互协作,最终将高级语言的源代码转化为目标机器可执行的代码。

这个过程可以分为前端和后端两个部分,前端主要负责语法和语义分析等,后端主要负责中间代码的生成、目标代码生成和优化等。

编译过程需要充分考虑程序的正确性、效率和可维护性等方面的要求。

编译原理—pl0实验报告

编译原理—pl0实验报告

PL/0实验报告课程名称编译原理题目名称PL/0编译程序学生学院计算机科学与技术学院专业班级学号学生姓名班内序号山东理工大学实验报告纸第 1 页姓名:蔡鹏飞计算机院_11_级02班同组者成绩_________室温:气压:课程名称:编译原理教师签字实验项目编号(1)PL/0编译程序的分析指导教师鞠传香实验目的1.熟悉pl/0语言并能编写小程序2.掌握pl/0编译程序的编译过程(词法分析、语法分析、语义分析等)实验仪器(编号)材料、工具PC机、VC++6.0(原理概述)pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。

词法分析和代码生成作为独立的子程序供语法分析程序调用。

语法分析的同时,提供了出错报告和出错恢复的功能。

在源程序没有错误编译通过的情况下,调用类pcode解释程序解释执行生成的类pcode代码。

PL/0语言文法的EBNF表示EBNF表示的符号说明。

〈〉:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。

∷= :该符号的左部由右部定义,可读作'定义为'。

| :表示'或',为左部可由多个右部定义。

{ } :花括号表示其内的语法成分可以重复。

在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。

如:{*}表示*重复任意次,{*}38表示*重复3-8次。

[ ] :方括号表示其内的成分为任选项。

( ) :表示圆括号内的成分优先。

例:用EBNF描述<整数>文法的定义:<整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/// 栈顶指针减一相关过程:base(),interpret()。

编译原理_教学设计方案

编译原理_教学设计方案

一、课程概述编译原理是计算机科学中的一个核心课程,主要研究如何将高级语言程序转换为机器语言或中间代码的过程。

本课程旨在使学生掌握编译器的基本原理和设计方法,培养学生分析和解决问题的能力。

二、教学目标1. 知识目标:- 理解编译器的基本概念、工作原理和设计方法。

- 掌握词法分析、语法分析、语义分析、代码生成和优化等编译器核心组件的工作原理。

- 了解编译器在软件工程中的重要作用。

2. 能力目标:- 能够分析和设计简单的编译器。

- 能够运用编译原理知识解决实际问题。

- 培养学生的编程能力和算法设计能力。

3. 素质目标:- 培养学生的逻辑思维能力和严谨的学术态度。

- 增强学生的团队合作意识和沟通能力。

三、教学内容1. 引言:编译器的概念、发展历史和作用。

2. 词法分析:正规表达式、有限自动机、词法分析器设计。

3. 语法分析:上下文无关文法、递归下降分析、LL(1)分析、LR分析。

4. 语义分析:类型检查、作用域分析、语义规则。

5. 中间代码生成:三地址码、四元式、逆波兰表示法。

6. 代码优化:数据流分析、代码优化策略。

7. 目标代码生成:机器代码、汇编语言、目标代码生成技术。

8. 编译器构造工具:编译器生成器、代码优化工具。

四、教学方法1. 讲授法:系统讲解编译原理的基本概念、原理和方法。

2. 案例分析法:通过分析经典的编译器案例,加深对理论知识的理解。

3. 实验法:设计实验,让学生动手实现编译器的基本组件。

4. 讨论法:组织课堂讨论,激发学生的学习兴趣,培养学生的批判性思维。

5. 项目法:设计编译器开发项目,让学生综合运用所学知识。

五、教学过程1. 导入:介绍编译原理的重要性,激发学生的学习兴趣。

2. 讲解:系统讲解编译原理的基本概念和原理。

3. 案例分析:分析经典的编译器案例,帮助学生理解理论知识。

4. 实验:设计实验,让学生动手实现编译器的基本组件。

5. 讨论:组织课堂讨论,解决学生在学习过程中遇到的问题。

sdt编译原理

sdt编译原理

sdt编译原理
SDT(Syntax-directed translation)是一种编译原理,用于在源代码的语法分析过程中将源代码转换为目标代码或其他形式的输出。

SDT的核心思想是将翻译操作与语法规则相结合,使得翻译过程与语法分析过程同步进行。

在SDT中,每个语法规则都与一个或多个动作相关联,这些动作定义了在语法分析过程中需要执行的操作。

这些动作可以是计算、赋值、控制流语句等,用于生成目标代码或实施语义动作。

在执行这些动作时,SDT使用语法树作为中间表示的数据结构。

SDT的编译过程可以分为以下几个步骤:
1. 词法分析:将源代码分解为词法单元(token)序列。

2. 语法分析:根据定义的文法规则将词法单元序列组织成语法树。

3. 属性计算:在语法分析的同时,执行与语法规则相关联的动作,进行属性计算。

4. 目标代码生成:根据属性计算的结果,生成目标代码或其他形式的输出。

在SDT中,属性是与语法树节点关联的值,可以是终结符或非终结符的一些特征信息,比如类型、值、地址等。

属性可以在语法规则中被引用和修改。

属性的计算是通过语法规则中的继承和综合属性描述来进行的。

继承属性是从父节点向子节点传递的属性,综合属性是从子节
点向父节点传递的属性。

继承属性和综合属性的定义和计算规则由语法规则中的动作来指定。

属性的计算过程通常是采用自上而下递归的方式进行的。

总的来说,SDT是一种使用语法规则和动作相结合的方法,将语法分析与语义动作、属性计算、目标代码生成等操作同步进行,实现源代码到目标代码的转换。

编译原理的实验报告

编译原理的实验报告

一、实验目的1. 理解编译原理的基本概念和原理。

2. 掌握编译器的各个阶段及其实现方法。

3. 能够运用编译原理的知识解决实际问题。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 实验内容:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成三、实验内容1. 词法分析(1)实验目的:实现一个简单的词法分析器,将源代码中的字符序列转换为词法符号序列。

(2)实验步骤:1)定义词法符号类型,包括标识符、关键字、运算符、常量等。

2)设计词法分析器算法,对源代码进行遍历,将字符序列转换为词法符号序列。

3)实现词法分析器程序,输出词法符号序列。

(3)实验结果:输入源代码:int a = 10;输出词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}2. 语法分析(1)实验目的:实现一个简单的语法分析器,将词法符号序列转换为抽象语法树(AST)。

(2)实验步骤:1)定义语法规则,包括产生式、非终结符、终结符等。

2)设计语法分析算法,根据语法规则对词法符号序列进行解析,生成AST。

3)实现语法分析器程序,输出AST。

(3)实验结果:输入词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}输出AST:```AST:- ExpressionStatement- Expression- BinaryExpression- Identifier: a- Operator: =- Constant: 10```3. 语义分析(1)实验目的:实现语义分析器,对AST进行语义检查,确保程序的正确性。

(2)实验步骤:1)定义语义规则,包括类型检查、作用域检查等。

实验报告编译实验

实验报告编译实验

一、实验目的1. 理解编译原理的基本概念和过程。

2. 掌握编译器的基本组成和编译流程。

3. 学会使用编译器对源代码进行编译,并分析编译结果。

二、实验环境1. 操作系统:Windows 102. 编译器:GCC (GNU Compiler Collection)3. 开发工具:Visual Studio Code三、实验内容1. 编译器的基本组成和编译流程2. 编译器的使用3. 编译结果分析四、实验步骤1. 编译器的基本组成和编译流程(1)词法分析:将源代码分解成一个个的单词,如标识符、关键字、运算符等。

(2)语法分析:将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:将语法树转换成中间代码,如三地址代码。

(5)代码优化:对中间代码进行优化,提高程序运行效率。

(6)目标代码生成:将优化后的中间代码转换成目标代码,如汇编代码。

(7)代码生成:将目标代码转换成可执行文件。

2. 编译器的使用(1)编写源代码:使用Visual Studio Code编写C语言源代码。

(2)编译源代码:在命令行中输入gcc -o 程序名源文件名.c,编译源代码。

(3)运行程序:在命令行中输入程序名,运行编译后的程序。

3. 编译结果分析(1)词法分析:编译器将源代码中的单词进行分解,如以下代码:```cint main() {int a = 1;return a;}```编译器将分解为以下单词:- int- main- (- )- {- int- a- =- 1- ;- return- a- ;- }- }(2)语法分析:编译器将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:编译器检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:编译器将语法树转换成中间代码,如以下三地址代码:```t1 = 1a = t1t2 = areturn t2```(5)代码优化:编译器对中间代码进行优化,如以下优化后的三地址代码:```a = 1return a```(6)目标代码生成:编译器将优化后的中间代码转换成汇编代码。

编译原理教学大纲

编译原理教学大纲

编译原理教学大纲一、课程介绍本课程主要介绍编译原理的相关概念、理论和实践技术,旨在培养学生对编译原理的理解和应用能力。

通过本课程的学习,学生将了解到编译器的工作原理、设计流程和实现方法,掌握常见编程语言的词法分析、语法分析、语义分析和代码生成等基本技术。

二、教学目标1. 熟悉编译原理的基本概念和基础知识;2. 掌握编译器的各个模块的设计和实现方法;3. 能够使用现有编译器工具进行编译器开发和优化;4. 培养学生的编程能力、分析问题和解决问题的能力。

三、教学大纲1. 编译原理基础1.1 编译器的作用和概念- 编译过程及其阶段- 编译器的核心功能1.2 语言文法和自动机理论- 正则文法和有限自动机- 上下文无关文法和下推自动机1.3 词法分析- 正则表达式和有限自动机实现词法分析器 - 关键字、运算符、标识符、字面量的识别 2. 语法和语义分析2.1 自顶向下语法分析- LL(1)文法及其分析方法- 预测分析表和递归下降分析2.2 自底向上语法分析- LR(0)文法及其分析方法- SLR(1)文法和LR(1)文法分析2.3 语义分析与语法制导翻译- 语义动作和属性文法- 语法制导翻译的实现方法3. 中间代码生成与优化3.1 中间代码的表示和生成- 三地址码和虚拟机- 递归下降翻译的中间代码生成3.2 基本块和流图- 基本块的概念和划分- 控制流的分析和优化3.3 数据流分析与优化- 活性变量分析- 常量传播和复写传播优化4. 目标代码生成和优化4.1 目标代码生成的基本原理- 寄存器分配和指令选择- 代码布局和指令调度4.2 目标代码优化- 数据流分析在目标代码优化中的应用- 循环优化和内存优化四、教学方法本课程采用理论课与实践相结合的教学方法。

理论课重点讲解编译原理的基本概念和原理,实践课通过编写实际编译器项目,培养学生的编程和问题解决能力。

五、考核方式1. 平时成绩占比:40%包括课堂参与、作业完成情况和实验报告等。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的重要课程,旨在让学生了解编译器的基本工作原理以及相关技术。

本次实验旨在通过设计和实现一个简单的编译器,来进一步加深对编译原理的理解,并掌握实际应用的能力。

二、实验环境本次实验使用了Java编程语言及相关工具。

在开始实验前,我们需要安装Java JDK并配置好运行环境。

三、实验内容及步骤1. 词法分析词法分析是编译器的第一步,它将源代码分割成一系列词法单元。

我们首先实现一个词法分析器,它能够将输入的源代码按照语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。

我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。

3. 语义分析语义分析是编译器的第三步,它对语法树进行检查和转换。

我们主要进行类型检查、语法错误检查等。

如果源代码存在语义错误,编译器应该能够提供相应的错误提示。

4. 代码生成代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。

在本次实验中,我们将目标代码生成为Java字节码。

5. 测试与优化完成以上步骤后,我们需要对编译器进行测试,并进行优化。

通过多个测试用例的执行,我们可以验证编译器的正确性和性能。

四、实验心得通过完成这个编译器的实验,我收获了很多。

首先,我对编译原理的知识有了更深入的理解。

在实验过程中,我深入学习了词法分析、语法分析、语义分析和代码生成等关键技术,对编译器的工作原理有了更系统的了解。

其次,我提高了编程能力。

实现一个完整的编译器需要处理复杂的数据结构和算法,这对我的编程能力是一个很好的挑战。

通过实验,我学会了合理地组织代码,优化算法,并注意到细节对程序性能的影响。

最后,我锻炼了解决问题的能力。

在实验过程中,我遇到了很多困难和挑战,但我不断地调试和改进代码,最终成功地实现了编译器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5. 目标代码生成本章实验为实验四,是最后一次实验,其任务是在词法分析、语法分析、语义分析和中间代码生成程序的基础上,将C 源代码翻译为MIPS32指令序列(可以包含伪指令),并在SPIM Simulator上运行。

当你完成实验四之后,你就拥有了一个自己独立编写、可以实际运行的编译器。

选择MIPS作为目标体系结构是因为它属于RISC范畴,与x86等体系结构相比形式简单便于我们处理。

如果你对于MIPS体系结构或汇编语言不熟悉并不要紧,我们会提供详细的参考资料。

需要注意的是,由于本次实验的代码会与之前实验中你已经写好的代码进行对接,因此保持一个良好的代码风格、系统地设计代码结构和各模块之间的接口对于整个实验来讲相当重要。

5.1 实验内容5.1.1 实验要求为了完成实验四,我们建议你首先下载并安装SPIM Simulator用于对生成的目标代码进行检查和调试,SPIM Simulator的官方下载地址为:/~larus/spim.html。

这是由原Wisconsin-Madison的Jame Larus教授(现在在微软)领导编写的一个功能强大的MIPS32汇编语言的汇编器和模拟器,其最新的图形界面版本QtSPIM由于使用了Qt组件因而可以在各大操作系统平台如Windows、Linux、Mac等上运行,推荐安装。

我们会在后面介绍有关SPIM Simulator的使用方法。

你需要做的就是将实验三中得到的中间代码经过与具体体系结构相关的指令选择、寄存器选择以及栈管理之后,转换为MIPS32汇编代码。

我们要求你的程序能输出正确的汇编代码。

“正确”是指该汇编代码在SPIM Simulator(命令行或Qt版本均可)上运行结果正确。

因此,以下几个方面不属于检查范围:1)寄存器的使用与指派可以不必遵循MIPS32的约定。

只要不影响在SPIM Simulator中的正常运行,你可以随意分配MIPS体系结构中的32个通用寄存器,而不必在意哪些寄存器应该存放参数、哪些存放返回值、哪些由调用者负责保存、哪些由被调用者负责保存,等等。

2)栈的管理(包括栈帧中的内容及存放顺序)也不必遵循MIPS32的约定。

你甚至可以使用栈以外的方式对过程调用间各种数据的传递进行管理,前提是你输出的目标代码(即MIPS32汇编代码)能运行正确。

当然,不检查并不代表不重要。

我们建议你试着去遵守MIPS32中的各种约定,否则你的程序生成的目标代码在SPIM Simulator中运行时可能会出现一些意想不到的错误。

另外,实验四对作为输入的C--源代码有如下的假设:1)假设1:输入文件中不包含任何词法、语法或语义错误。

2)假设2:不会出现注释、八进制或十六进制整型常数、浮点型常数或者变量。

3)假设3:整型常数都在16bits位的整数范围内,也就是说你不必考虑如果某个常数无法在addi等包含立即数的指令中表示时该怎么办。

4)假设4:不会出现类型为结构体或高维数组(高于1维的数组)的变量。

5)假设5:所有的变量均不重名,变量的存储空间都放到该变量所在的函数的活动记录中。

6)假设6:任何函数参数都只能是简单变量,也就是说数组和结构体不会作为参数传入某个函数中。

7)假设7:函数不会返回结构体或数组类型的值。

8)假设8:函数只会进行一次定义(没有函数声明)。

在进行实验四之前,请阅读后面的实验指导部分,以确保你已经了解MIPS32汇编语言以及SPIM Simulator的使用方法,这些内容是你顺利完成实验四的前提。

5.1.2 输入格式你的程序的输入是一个包含C--源代码的文本文件,你的程序需要能够接收一个输入文件名和一个输出文件名作为参数。

例如,假设你的程序名为cc、输入文件名为test1.cmm、输出文件名为out.s,程序和输入文件都位于当前目录下,那么在Linux命令行下运行./cc test.cmm out.s 即可将输出结果写入当前目录下名为out.s的文件中。

5.1.3 输出格式实验四要求你的程序将运行结果输出到文件。

对于每个输入文件,你的程序应当输出相应的MIPS32汇编代码。

我们将使用SPIM Simulator对你输出的汇编代码的正确性进行测试,任何能被SPIM Simulator执行并且结果正确的输出都将被接受。

5.1.4 测试环境你的程序将在如下环境中被编译并运行:1)GNU Linux Release: Ubuntu 12.04, kernel version 3.2.0-29;2)GCC version 4.6.3;3)GNU Flex version 2.5.35;4)GNU Bison version 2.5;5)QtSPIM version 9.1.9。

一般而言,只要避免使用过于冷门的特性,使用其它版本的Linux或者GCC等,也基本上不会出现兼容性方面的问题。

注意,实验四的检查过程中不会去安装或尝试引用各类方便编程的函数库(如glib等),因此请不要在你的程序中使用它们。

5.1.5 提交要求实验四要求提交如下内容(同实验一):1)Flex、Bison以及C语言的可被正确编译运行的源程序。

2)一份PDF格式的实验报告,内容包括:a)你的程序实现了哪些功能?简要说明如何实现这些功能。

清晰的说明有助于助教对你的程序所实现的功能进行合理的测试。

b)你的程序应该如何被编译?可以使用脚本、makefile或逐条输入命令进行编译,请详细说明应该如何编译你的程序。

无法顺利编译将导致助教无法对你的程序所实现的功能进行任何测试,从而丢失相应的分数。

c)实验报告的长度不得超过一页!所以实验报告中需要重点描述的是你的程序中的亮点,是你认为最个性化、最具独创性的内容,而相对简单的、任何人都可以做的内容则可不提或简单地提一下,尤其要避免大段地向报告里贴代码。

实验报告中所出现的最小字号不得小于五号字(或英文11号字)。

5.1.6 样例实验四无选做要求,因此下面只列举必做内容的样例。

请仔细阅读样例,以加深对实验要求以及输出格式要求的理解。

样例1:输入:1 int main()2 {3 int a = 0, b = 1, i = 0, n;4 n = read();5 while (i < n)6 {7 int c = a + b;8 write(b);9 a = b;10 b = c;11 i = i + 1;12 }13 return 0;14 }输出:该样例程序读入一个整数n,然后计算并输出前n个Fibonacci数的值。

将其翻译为一段能在SPIM Simulator中执行的正确的目标代码可以是这样的:图15. 样例1汇编代码的运行结果。

1 .data2 _prompt: .asciiz "Enter an integer:"3 _ret: .asciiz "\n"4 .globl main5 .text6 read:7 li $v0, 48 la $a0, _prompt9 syscall10 li $v0, 511 syscall12 jr $ra1314 write:15 li $v0, 116 syscall17 li $v0, 418 la $a0, _ret19 syscall20 move $v0, $021 jr $ra2223 main:24 li $t5, 025 li $t4, 126 li $t3, 027 addi $sp, $sp, -428 sw $ra, 0($sp)29 jal read30 lw $ra, 0($sp)31 addi $sp, $sp, 432 move $t1, $v033 move $t2, $t134 label1:35 blt $t3, $t2, label236 j label337 label2:38 add $t1, $t5, $t439 move $a0, $t440 addi $sp, $sp, -441 sw $ra, 0($sp)42 jal write43 lw $ra, 0($sp)44 addi $sp, $sp, 445 move $t5, $t446 move $t4, $t147 addi $t1, $t3, 148 move $t3, $t149 j label150 label3:51 move $v0, $052 jr $ra该汇编代码在命令行SPIM Simulator中的运行结果如图15所示(输入7,则输出前7个Fibonacci数)。

样例2:输入:1 int fact(int n)2 {3 if (n == 1)4 return n;5 else6 return (n * fact(n - 1));7 }89 int main()10 {11 int m, result;12 m = read();13 if (m > 1)14 result = fact(m);15 else16 result = 1;17 write(result);18 return 0;19 }输出:该样例程序读入一个整数n,然后计算并输出n!的值。

将其翻译为一段能在SPIM Simulator 中执行的正确的目标代码可以是这样的:1 .data2 _prompt: .asciiz "Enter an integer:"3 _ret: .asciiz "\n"4 .globl main5 .text6 read:7 li $v0, 48 la $a0, _prompt9 syscall10 li $v0, 511 syscall12 jr $ra1314 write:15 li $v0, 116 syscall17 li $v0, 418 la $a0, _ret19 syscall20 move $v0, $021 jr $ra2223 main:24 addi $sp, $sp, -425 sw $ra, 0($sp)26 jal read27 lw $ra, 0($sp)28 addi $sp, $sp, 429 move $t1, $v030 li $t3, 131 bgt $t1, $t3, label632 j label733 label6:34 move $a0, $t1图16. 样例2汇编代码的运行结果。

35 addi $sp, $sp, -436 sw $ra, 0($sp)37 jal fact38 lw $ra, 0($sp)39 addi $sp, $sp, 440 move $t2, $v041 j label842 label7:43 li $t2, 144 label8:45 move $a0, $t246 addi $sp, $sp, -447 sw $ra, 0($sp)48 jal write49 lw $ra, 0($sp)50 addi $sp, $sp, 451 move $v0, $052 jr $ra5354 fact:55 li $t4, 156 beq $a0, $t4, label157 j label258 label1:59 move $v0, $a060 jr $ra61 label2:62 addi $sp, $sp, -863 sw $a0, ($sp)64 sw $ra, 4($sp)65 sub $a0, $a0, 166 jal fact67 lw $a0, ($sp)68 lw $ra, 4($sp)69 addi $sp, $sp, 870 mul $v0, $v0, $a071 jr $ra该汇编程序在QtSPIM中的运行结果如图16所示(输入7,输出5040)。

相关文档
最新文档