第12章pl0代码生成_第1页
第12章pl0代码生成_第2页
第12章pl0代码生成_第3页
第12章pl0代码生成_第4页
第12章pl0代码生成_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1PL/0编译程序的目标代码结构和代码生成编译程序的目标代码结构和代码生成 目标代码目标代码类类pcodepcode是是一种一种假想栈式计算机假想栈式计算机的的汇编语言汇编语言。指令格式:指令格式:f l af l af f功能码功能码l l层次差层次差 (标识符(标识符引用层引用层减去减去定义层定义层)a a根据不同的指令有所区别根据不同的指令有所区别 目标指令见下页目标指令见下页见P23页2L LI IT T 0 0 a a 将将常常数数值值取取到到栈栈顶顶,a a为为常常数数值值 L LO OD D l l a a 将将变变量量值值取取到到栈栈顶顶,a a为为相相对对运运行行栈栈基基址址

2、的的偏偏移移量量,l l为为层层差差 S ST TO O l l a a 将将栈栈顶顶内内容容送送入入某某变变量量单单元元中中,a a为为相相对对运运行行栈栈基基址址偏偏移移量量,l l为为层层差差 C CA AL L l l a a 调调用用过过程程,a a为为过过程程入入口口地地址址,l l为为层层差差 I IN NT T 0 0 a a 在在运运行行栈栈中中为为被被调调用用的的过过程程开开辟辟a a个个单单元元的的数数据据区区 J JM MP P 0 0 a a 无无条条件件跳跳转转至至a a地地址址 J JP PC C 0 0 a a 条条件件跳跳转转,当当栈栈顶顶布布尔尔值值非非真真

3、则则跳跳转转至至a a地地址址,否否则则顺顺序序执执行行 O OP PR R 0 0 0 0 过过程程调调用用结结束束后后, ,返返回回调调用用点点并并退退栈栈 O OP PR R 0 0 1 1 栈栈顶顶元元素素取取反反 O OP PR R 0 0 2 2 次次栈栈顶顶与与栈栈顶顶相相加加,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 3 3 次次栈栈顶顶减减去去栈栈顶顶,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 4 4 次次栈栈顶顶乘乘以以栈栈顶顶,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 5

4、 5 次次栈栈顶顶除除以以栈栈顶顶,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 6 6 栈栈顶顶元元素素的的奇奇偶偶判判断断,结结果果值值在在栈栈顶顶 O OP PR R 0 0 7 7 O OP PR R 0 0 8 8 次次栈栈顶顶与与栈栈顶顶是是否否相相等等,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 9 9 次次栈栈顶顶与与栈栈顶顶是是否否不不等等,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 1 10 0 次次栈栈顶顶是是否否小小于于栈栈顶顶,退退两两个个栈栈元元素素,结结果果值值进进栈栈

5、O OP PR R 0 0 1 11 1 次次栈栈顶顶是是否否大大于于等等于于栈栈顶顶,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 1 12 2 次次栈栈顶顶是是否否大大于于栈栈顶顶,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 1 13 3 次次栈栈顶顶是是否否小小于于等等于于栈栈顶顶,退退两两个个栈栈元元素素,结结果果值值进进栈栈 O OP PR R 0 0 1 14 4 栈栈顶顶值值输输出出至至屏屏幕幕 O OP PR R 0 0 1 15 5 屏屏幕幕输输出出换换行行 O OP PR R 0 0 1 16 6 从从命命令令行

6、行读读入入一一个个输输入入置置于于栈栈顶顶 指指令令功功能能表表3代码生成代码生成代码生成是由过程代码生成是由过程GENGEN完成。完成。P417P417GENGEN有有3 3个个参数参数,分别代表目标代码的,分别代表目标代码的功能码功能码,层差层差和和位移量位移量。例如。例如 gen(opr,0,16);gen(opr,0,16);从命令行读取值到栈顶从命令行读取值到栈顶 gen(sto,lev-level,adr)gen(sto,lev-level,adr) 将栈顶内容送到变量单元中,将栈顶内容送到变量单元中, levlev:当前:当前处理的处理的过程过程层次层次 levellevel:被

7、引用变量或过程所在:被引用变量或过程所在层次层次 CXCX:为目标代码:为目标代码codecode数组的下标指针数组的下标指针4Code: array0.cxmax of instruction; p414fct=(lit, opr, lod, sto, cal, int, jmp, jpc) P413Instruction= packec record P413 f: fct; l: 0.levmax a: 0.amax; end;5CODECODE为一维数组,数组元素为记录型数据。每一个记录就是一条目标指令。CXCX为指令的指针,由0开始顺序增加。实际上目标代码的顺序是内层过程的排在前边,

8、实际上目标代码的顺序是内层过程的排在前边,主程序的目标代码在最后。主程序的目标代码在最后。下面我们给出一个下面我们给出一个PL/0PL/0源程序和对应的目标程序源程序和对应的目标程序的清单。的清单。在在block入口处生成一条入口处生成一条(jmp,0,0)指令,作为过程指令,作为过程体入口指令,该指令的第体入口指令,该指令的第3区域的区域的0需分析到过需分析到过程体入口时才返填。程体入口时才返填。6 const a=10; const a=10;var b,c;var b,c;procedure p;procedure p; beginbegin c:=b+a; c:=b+a; end; e

9、nd;beginbegin read(b); read(b); while while b#0b#0 do do begin begin call p; call p; write(2 write(2* *c);c); read(b); read(b); end endend.end.( 0) jmp 0 8 ( 0) jmp 0 8 转向转向主程序入口主程序入口( 1) jmp 0 2 ( 1) jmp 0 2 转向转向过程过程p p入口入口( 2) int 0 3 ( 2) int 0 3 过程过程p p入口入口, ,为过程为过程p p开辟空间开辟空间( 3) lod 1 3 ( 3) l

10、od 1 3 取变量取变量b b的值到栈顶的值到栈顶( 4) lit 0 10 ( 4) lit 0 10 取常数取常数1010到栈顶到栈顶( 5) opr 0 2 ( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 ( 6) sto 1 4 栈顶值送变量栈顶值送变量c c中中( 7) opr 0 0 ( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)(16)( 8) int 0 5 ( 8) int 0 5 主程序入口开辟主程序入口开辟5 5个栈空间个栈空间( 9) opr 0 16 ( 9) opr 0 16 从命令行读入值置于栈顶从命令行读

11、入值置于栈顶(10) sto 0 3 (10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b b中中(11) (11) lod 0 3 lod 0 3 将变量将变量b b的值取至栈顶的值取至栈顶(12) lit 0 0 (12) lit 0 0 将常数值将常数值0 0进栈进栈(13) opr 0 9 (13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) (14) jpc 0 24jpc 0 24 等时转等时转(24)(24)(条件不满足转条件不满足转)(15) cal 0 2 (15) cal 0 2 调用过程调用过程p p(16) lit 0 2 (16) lit

12、 0 2 常数值常数值2 2进栈进栈(17) lod (17) lod 0 0 4 4 将变量将变量c c的值取至栈顶的值取至栈顶(18) opr 0 4 (18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2(2* *c)c)(19) opr 0 14 (19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 (20) opr 0 15 换行换行(21) opr 0 16 (21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto (22) sto 0 0 3 3 栈顶值送变量栈顶值送变量b b中中(23) jmp 0 11 (

13、23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(11)(24) opr 0 0 (24) opr 0 0 结束退栈结束退栈7PL/0PL/0编译程序的目标代码生成是由编译程序的目标代码生成是由GENGEN过程完成的过程完成的 ,当,当语法分析正确语法分析正确, ,则调用目标代码生成过程以生成与则调用目标代码生成过程以生成与PL/0PL/0语句等价功能的目标代码,直到编译正常结束。语句等价功能的目标代码,直到编译正常结束。 注意:过程说明部分,变量和常量的说明都不产生目注意:过程说明部分,变量和常量的说明都不产生目标代码。标代码。 对分程序体入口的处理(见程序文本对分程序

14、体入口的处理(见程序文本P424页页block 的过的过程体)程体)begin (*block*)dx:=3;tx0:=tx; (*保留当前保留当前table表指针值表指针值,实际为过程名在实际为过程名在table表表中的位置中的位置*)tabletx.adr:=cx;(*保留当前保留当前code指针值到过程名指针值到过程名的的adr域域*) gen(jmp,0,0);(jmp,0,0)指令,作为过程体入口指令,该指指令,作为过程体入口指令,该指令的第令的第3区域的区域的0需分析到过程体入口时才需分析到过程体入口时才返填。返填。8录过程在code的入口到table中的adr域如下表所示: (*

15、生成转向过程体入口的指令,该指令的地址为生成转向过程体入口的指令,该指令的地址为cx已保留在过程名的已保留在过程名的adr域,域,真正的过程体入口地址,等生成过程体入口的指令时,将过程体入口回填真正的过程体入口地址,等生成过程体入口的指令时,将过程体入口回填(jmp,0,0)的第)的第3区域,同时填到区域,同时填到tabletx0.adr 中中*)tx0tx0:=tx;tabletx.adr:=cx;tx9table表格管理 codetabletx0.adr.a:=cx;tx0txtabletx0.adr=cx10过程体入口时的处理 table表格管理 codetabletx0.adr.a:=

16、cx;(cx为过程入口地址)为过程入口地址) with tabletx0 do begin adr:=cx; (tabletx0.adr=cx)size:=dx; (tabletx0.sizedx)end;请特别注意请特别注意dx、 tx、 cx的作用和如何处理信息之的作用和如何处理信息之间的连接关系。间的连接关系。11 CASE WHILESYM:CX1=CX; GetSym(); /保留保留L1的地址的地址 CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX); /生成生成B的代码的代码CX2=CX; GEN(JPC,0,0);/条件跳转条件跳转, L2待定待定,

17、if (SYM=DOSYM) GetSym();else Error(18);STATEMENT(FSYS,LEV,TX);/生成生成S的代码的代码GEN(JMP,0,CX1); /无条件跳转无条件跳转, 转到转到L1CODECX2.A=CX; /回填回填L2break; switch (SYM) While B Do SBFalseS转L1L1:L2 :CX1CX212条件语句的一般形式:条件语句的一般形式:IF IF 条件条件B THEN B THEN 语句语句S1 ELSE S1 ELSE 语句语句S2 S2 If B Then0(false) S1 。 ElseL1:S2L2CX1CX

18、213Switch(SYM)case IFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX); 生成B的代码 if (SYM=THENSYM) GetSym();else Error(16); GEN(JPC,0,0);条件跳转STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX); 生成S1的代码If ( ) CODECX1.A=CXElse CX2=CX; Gen(JMP,0,0) ; 转向S2STATEMENT(FSYS,LEV,TX); 生成S2的代码 ;break; CX1=CX;SYM!=ELSECODECX1.ACXCODECX2.ACXIf B Then0(false) S1 。 ElseL1:S2L2CX1CX214解释程序还定义了解释程序还定义了4个寄存器。个寄存器。(1) I:指令寄存器。存放着当前正在解释的一条:指令寄存器。存放着当前正在解释的一条 目标指令。目标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论