1、四元式序列转换虚拟机目标代码一、实验目的1、熟悉和掌握四元式序列转换成目标代码的原理2、设计一个程序,能使给定的任一四元式转换成虚拟目标代码。二、实验步骤1、需求分析(1)、产生四元式序列翻译方案设计对于产生四元式序列的翻译方案的设计,以下面的作为例子关于赋值语句的四元式序列的翻译方案S:=id=Ep:=lookup(id.name);if pNULL then genquad(:,E.place,*p.place)else errorE:=E1+E2E.place:=newtemp;Fenquad(+, E 1 .place, E2 .place,E.place)E:= E1 * E2 E.
2、place:=newtemp;Fenquad(*, E 1 .place, E2 .place,E.place)E:= - E1 E.place:=newtemp;Genquad(NEG, E 1.place,E.place)E:=( E1)E.place:= E1 .placeE:=idp:=lookup(id.name);if pNULL then E.place:=*p.placeelse error其中,过程 genquad(op,x,y,z)功能是生成四元式:op x y z(2)、四元式生成目标代码从四元式序列生成目标代码的工作的主要问题是运算分量与计算结果的存取问题,在生成目标指
3、令时,要考虑四元式中运算分量是在寄存器中还是在内存中。当在寄存器中时,以后还会被使用否,等等。例如,对于四元式- x y z如果 x 和 y 都不在寄存器中,则可生成下列目标指令:MOV x, RiSUB y, Ri计算结果 z 在寄存器 Ri 中。如果寄存器 Ri 与寄存器 Rj 分别包含 x 与 y。及 x 与 y 的值分别在寄存器 Ri 与 Rj, 且此四元式后不再引用 x,可以为其生成目标指令:SUB Rj , Ri计算结果 z 在 Ri 中。如果寄存器 Ri 包含 x 而 y 在内存单元,且此四元式后不再以用 x,可以生成目标指令:SUB y, Ri或者MOV y, RjSUB Rj
4、 , Ri计算结果 z 仍然在 Ri 中 所以,生成目标代码时应考察四元式及其上下文。针对具体情况生成合适的目标指令3、程序的源程序(1)、source.cpp#include#include#include#include#include“source.h“void change_to_source(ofstream ptemp,char*s,DLNode*dl,struct four *temp,int char karray4=“+“,“-“,“ “,“-“,“*“,“/“,“ “,“,“=“,“:=“,“,“goto“,“itof“,“return“,“call“;struct fou
5、rchar item44;struct four*next;void init_array0(char ay4,int length);void init_four(struct four *head)*head=new struct four();(*head)-next=NULL;init_array0(*head)-item,4);void add_four(struct four*fr,char parray4,int length) struct four*temp=(*fr);struct four*t;while(temp-next!=NULL)temp=temp-next;t=
6、new struct four();t-next=NULL;for(int i=0;iitemi,parrayi);temp-next=t;int change_style(char* item)for(int i=0;inext!=NULL) /char karray3=“+“,“-“,“ “,“-“,“*“,“/“,“ “,“,“=“,“:=“,“next-item0);if(i=-1)break;elsechange_to_source(ptemp,s,dl,temp,Rcount,item1,item2,i);(*temp)=(*temp)-next;void output(struc
7、t four*head) struct four*temp=head;while(temp-next!=NULL) for(int i=0;inext-iteminext;void main()FILE*fp=fopen(“four.txt“,“r“);ofstream tempp(“temp.txt“);FILE*fp2=fopen(“result.txt“,“a+“);struct four*head=new struct four();init_four(DLNode*head2;ListInitiate(get_from(fp,head);output(head);convertor(
8、tempp,/_itoaif(fp=NULL) coutnext-item1next-item2next-item3);elseDLNode *p=dl;init_array1(item1,4);while(p-prior!=dl)if(strcmp(temp-next-item1,p-prior-destion)!=0)p=p-prior;elsestrcpy(item1,p-prior-source);break;p=dl;init_array1(item2,4);while(p-prior!=dl)if(strcmp(temp-next-item2,p-prior-destion)!=0
9、)p=p-prior;elsestrcpy(item2,p-prior-source);break;if(item10!=0)if(item20!=0)/ptempnext-item2next-item1next-item1next-item2next-item3);change(s,R,Rcount);ListInsert(dl,s,temp-next-item3);(2)、source.h#include#includestruct node char source4;char destion4;struct node *next;struct node *prior;typedef st
10、ruct node DLNode;int ListInitiate(DLNode*head)*head=new DLNode();if(*head)=NULL)return 0;(*head)-prior=*head;(*head)-next=*head;return 1;int ListInsert(DLNode*head,char s,char d)DLNode*p,*s0;p=head-next ;while(p-next!=head)p=p-next;s0=new DLNode();if(s=NULL)return 0;strcpy(s0-source,s);strcpy(s0-des
11、tion,d);s0-prior=p-prior;p-prior-next=s0;s0-next=p;p-prior=s0;return 1;bool empty(DLNode*head)if(head-next=head)return true;return false;/int ListDelete(void ListOutput(DLNode*head) DLNode*temp=head;while(temp-next!=head)coutnext-sourcenext-destionnext;(3)、输入的四元式+ a b t1+ a c t2- c d t4+ t1 t2 t3* d e t5/ t2 t3 t5- t1 t4 t6- e f t7: = a b(4)、运行产生的结果mov a , R0add b , R0mov a , R1add c , R1mov c , R2sub d , R2add R0 , R1mov d , R3mpy e , R3div R1 , R2sub R0 , R2mov e , R4sub f , R4mov a , R5cj= b , R5
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。