第7章 目标代码生成

上传人:痛*** 文档编号:244262144 上传时间:2024-10-03 格式:PPT 页数:18 大小:153.50KB
返回 下载 相关 举报
第7章 目标代码生成_第1页
第1页 / 共18页
第7章 目标代码生成_第2页
第2页 / 共18页
第7章 目标代码生成_第3页
第3页 / 共18页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,7,章 目标代码生成,7.1,汇编语言虚拟计算机模型,7.2,从四元式到汇编语言的翻译,7.3,一个简单目标代码生成器,7.4,静态地址分配,1,任务,将中间代码变换成目标代码,实现源程序的最后翻译。由于涉及到目标机器的系统结构,此阶段的工作最复杂。,目标代码的形式,已定位的机器语言代码,编译后可立即执行。,待装配的机器语言代码模块,目前大多数编译系统所产生的目标代码均为可重定位的机器指令。在执行前,将它和系统函数(源程序中使用)的机器指令连接成一个程序,对未确定的地址进行定位(假设起始地址为,0,),形成可执行的机器语言代码程序。,在执行时,操作系统可将目标代码装入内存的任意位置。,汇编语言代码,需经汇编程序翻译,将其转换成可执行的机器语言代码。,由于硬件厂商提供机器的汇编程序,所以编译程序的目标代码通常为汇编语言。,目标代码生成要求,目标代码数与中间代码数的比值尽可能小(即目标代码尽可能少)。,充分利用寄存器,减少访问内存的次数。,删除不必要的临时变量。,2,7.1,汇编语言虚拟计算机模型,内存,共有,64k,个字,,1,个字有,16,个二进制位(,2Byte,),内存地址标识为,0-65535,。,划分为,256,页,页号,0-255,,每页的长度为,256,个字,页内位移为,0-255,。,地址计算:页号*,256+,页内位移。,255,页用作系统堆栈区。,寄存器,通用寄存器(,2,字节),共有,4,个,分别标记为,R0,、,R1,、,R2,、,R3,,用于存放操作数和计算结果,,R3,还可用于变址寻址。,标志寄存器,FlagReg,保存,CMP,指令比较结果。,堆栈寄存器,TopReg,(,2,字节),TopReg,用作系统栈顶指针。,3,指令系统,指令格式:,操作码,Read,从键盘读一个字到第一地址。,Write,从第一地址写一个字到屏幕。,Load,从第二地址将字装入第一地址。,Store,将第一地址中的字存放到第二地址。,Call,控制转移到第二地址指定的内存单元,断点保留在系统堆栈中。,Ret,由系统堆栈获得断点,返回。,Add,将第一地址中的字加上第二地址中的字,结果保留第一地址中。,Sub,Mul,Div,Cmp,将第一地址中的字和第二地址中的字比较,由系统置位,FlagReg,。,FlagReg,=-1,,表示第一地址中的字小于第二地址中的字。,FlagReg,=1,,表示第一地址中的字大于第二地址中的字。,FlagReg,=0,,表示第一地址中的字等于第二地址中的字。,4,JMP,无条件转移到第二地址指定的内存单元。,JMPNEG,若,FlagReg,中的值,0,,转移到第二地址指定的内存单元。,JMPPOS,若,FlagReg,中的值,0,,转移到第二地址指定的内存单元。,JMPZERO,若,FlagReg,中的值,0,,转移到第二地址指定的内存单元。,HALT,终止程序执行。,第一地址为寄存器(,R0-R3,),寻址方式和第二地址,直接地址寻址(,M,),Load,Ri,MXX(,XX)Ri,XX,范围,0-255,(第,0,页),用,16,进制表示。,寄存器寻址(,R,),Load,Ri,Rj,(,Rj)Ri,间址寄存器寻址(,R,),Load,Ri,Rj,(,Rj)Ri,直接数访问(,D,),Load,Ri,XX,XXRi,XX,范围,0-255,,用,16,进制表示。,变址寻址(,C R3,),Load,Ri,CR3(C*256+(R3)Ri,C,为常数(范围,0-255,),用,16,进制表示。,5,指令分类,零地址指令,Ret,、,Halt,A,型一地址指令(无第二地址),Write,、,Read,B,型一地址指令(无第一地址),Call,、,Jmp,、,JmpNeg,、,JmpZero,、,JmpPos,二地址指令,Load,、,Store,、,Add,、,Sub,、,Mul,、,Div,、,Cmp,6,7.2,从四元式到汇编语言的翻译,符号表、常数表和临时变量表的内存位置,四元式中含有变量在符号表和临时变量表中的入口,以及常数在常数表中的地址,所以先确定符号表、临时变量表和常数表在内存中的位置,然后再讨论四元式的翻译。,无符号实常数表(第,254,页,按地址递减使用),起始地址:,254*256+255=65279,,每个实常数占用,2,个字,(4Byte),。,无符号整常数表(第,254,页,按地址递增使用),起始地址:,254*256=65024,,每个整常数占用,1,个字(,2Byte,)。,符号表(第,252,、,253,页,按地址递减使用),起始地址:,253*256+255=65023,,每个标识符占用,4,个字,(8Byte),。,临时变量表(第,252,、,253,页,按地址递增使用),起始地址:,252*256=64512,,每个临时变量占用,4,个字,(8Byte),。,注:四元式中最多允许出现,512/4=128,个不同的变量,包括临时变量在内。,7,虚拟内存示意图,(,共,64K,、分,255,页、每页,255,字节,),8,设源程序为:,a=2+(+b+1),,它的四元式代码为,+&b 0&T1,+&T1&1&T2,+&2&T2&T3,=&T3 0&a,假设,整常数,1,在无符号整常数表中的地址为,65024,(,254*256+0,),整常数,2,在无符号整常数表中的地址为,65025,(,254*256+1,),变量,a,的符号表入口为,65023,(,253*256+255,),变量,b,的符号表入口为,65019,(,253*256+251,),临时变量,T1,的临时变量表入口为,64512,(,252*256+0,),临时变量,T2,的临时变量表入口为,64516,(,252*256+4,),临时变量,T3,的临时变量表入口为,64520,(,252*256+8,),实际四元式代码序列应为,+65019064512,+645126502464516,+650256451664520,=64520065023,9,单个四元式的翻译,四元式的翻译关键是确定地址,约定如下:,指令的第一地址使用,R0,。,指令的第二地址使用,R3,(兼作变址寄存器)。,ARG1,、,ARG2,为变量地址或常数地址,,RESULT,一定是变量地址。,C1=ARG1/256,、,D1=ARG1%256,。,C2=ARG2/256,、,D2=ARG2%256,。,C3=RESULT/256,、,D3=RESULT%256,。,注:,C1,、,C2,、,C3,表示页码,,D1,、,D2,、,D3,表示页内位移。,例,1,:,(+,ARG1,ARG2,RESULT),其中,ARG1,是变量在符号表入口,,ARG2,是常数地址。,解:,Load R3,D1/,第一操作数(变量在符号表入口),Load R0,C1R3,Load R0,R0/,第一运算量的值在,R0,中,Load R3,D2/,第二操作数(常数地址),Add R0,C2R3,Load R3,D3/,结果保存(符号表或临时变量表入口),Load R3,C3R3,Store R0,R3,10,例,2,:,(=,ARG1,0,RESULT),其中,ARG1,是常数地址。,解:,Load R3,D1,Load R0,C1R3/,第一运算量的值在,R0,中,Load R3,D3/,结果保存(符号表或临时变量表入口),Load R3,C3R3,Store R0,R3,单个四元式的翻译,四元式的翻译关键是确定地址,约定如下:,指令的第一地址使用,R0,。,指令的第二地址使用,R3,(兼作变址寄存器)。,ARG1,、,ARG2,为变量地址或常数地址,,RESULT,一定是变量地址。,C1=ARG1/256,、,D1=ARG1%256,。,C2=ARG2/256,、,D2=ARG2%256,。,C3=RESULT/256,、,D3=RESULT%256,。,注:,C1,、,C2,、,C3,表示页码,,D1,、,D2,、,D3,表示页内位移。,11,对照表,一条四元式代码通常译成若干条汇编语句,为了便于转移四元式的翻译,应建立一张对照表,记录一个四元式所对应的汇编语句的个数以及汇编语句的编号。,对照表结构如下:,四元式编号,汇编语句条数,汇编语句编号,1,8,1,2,6,9,15,7.3,一个简单目标代码生成器,不考虑充分利用寄存器,仅仅使用,R0,和,R3,。,指令的第一地址使用,R0,,指令的第二地址使用,R3,(兼作变址寄存器)。算法描述详见下一页。,12,0.procedure GenCode(op,arg1,arg2,result),/,一个简单目标代码生成器,1.c1arg1/256:d1arg1%256;,2.c2arg2/256:d2arg2%256;,3.c3result/256:d3result%256;,ment:R0(ARG1),5.output Load R3,:output d1:output,换行,6,output Load R0,:output c1:output R3:output,换行,7.if c1=252 or c1=253 then,/ARG1,是符号表或临时变量表的入口,8.output Load R0,R0:output,换行,9.end if,/ARG1,是常数表入口无需上述指令,ment:R0,运算结果,处理加法运算(,ARG20,),处理一元正运算(,ARG2=0,),处理减法运算(,ARG20,),/,详见下一页,处理一元负运算(,ARG2=0,),/,详见下一页,赋值运算(无需任何处理),ment:RESULT(R0),12.output Load R3,:output d3:output,换行,13.output Load R3,:output c3:output R3:output,换行,14.output store R0,R3:output,换行,15.end procedure,13,/,处理减法运算(,ARG20,),comment:R0,运算结果,if op=-and arg20 then,output Load R3,:output d2:output,换行,if c2=252 or c2=253 then,/ARG2,是符号表或临时变量表的入口,output Load R3,:output c2:output R3:output,换行,output Sub R0,R3:output,换行,else,/ARG2,是常数表地址,output Sub R0,:output c2:output R3,endl,;,end if,end if,/,处理一元负运算(,ARG2=0,),if op=-and arg2=0 then,/-ARG1=0-ARG1,output Load R3,R0:output,换行,/,将,ARG1,送,R3,output Load R0,0:output,换行,/,将,0,送,R0,output Sub R0,R3:output,换行,/R0-R3,送,R0,end if,14,实例,设源程序为:,a=2+(+b+1),,它的四元式代码为,+&b 0&T1,+&T1&1&T2,+&2&T2&T3,=&T3 0&a,假设,整常数,1,在无符号整常数表中的地址为,65024,(,254*256+0,),整常数,2,在无符号整常数表中的地址为,65025,(,254*256+1,),变量,a,的符号表入口为,65023,(,253*256+255,),变量,b,的符号表入口为,65019,(,253*256+251,),临时变量,T1,的临时变量表入口为,64512,(,252*256+0,),临时变量,T2,的临时变量表入口为,64516
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!