CODGEN (Материалы к контрольным работам)
Описание файла
Файл "CODGEN" внутри архива находится в следующих папках: Материалы к контрольным работам, Материалы (3), CONSCOMP. Документ из архива "Материалы к контрольным работам", который расположен в категории "". Всё это находится в предмете "конструирование компиляторов" из 6 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "CODGEN"
Текст из документа "CODGEN"
8.3. � § 票¥ ¤à¥á®¢
� § 票¥ ¤à¥á®¢ ¯¥à¥¬¥ë¬, ¯ à ¬¥âà ¬ ¨ ¯®«ï¬ § ¯¨á¥© ¯à®¨á室¨â ¯à¨ ®¡à ¡®âª¥ ᮮ⢥âáâ¢ãîé¨å ®¡ê¥¨©. ‚ ®¤®¯à®å®¤®¬ âà á«ïâ®à¥ íâ® ¬®¦¥â ¯à®¨§¢®¤¨âìáï ¢¬¥áâ¥ á ¯®áâ஥¨¥¬ ®á®¢®© â ¡«¨æë ᨬ¢®«®¢ ¨ ᮮ⢥âáâ¢ãî騥 ¤à¥á (¨«¨ ᬥ饨ï) ¬®£ãâ åà ¨âìáï ¢ í⮩ ¦¥ â ¡«¨æ¥. ‚ ¯à®¬¥¦ãâ®ç®¬ ¯à¥¤áâ ¢«¥¨¨ ‹¨¤¥à ®¡ê¥¨ï á®åà ¥ë, çâ® ¤¥« ¥â íâ® ¯à®¬¥¦ãâ®ç®¥ ¯à¥¤áâ ¢«¥¨¥ ¬ 訮-¥§ ¢¨á¨¬ë¬. � ¯®¬¨¬, çâ® ¢ ‹¨¤¥à-¯à¥¤áâ ¢«¥¨¨ ª ¦¤®¬ã ®¯¨á ¨î ᮮ⢥âáâ¢ã¥â ¥ª®â®àë© ®¬¥à. ‚ ¯à®æ¥áá¥ à ¡®âë £¥¥à â®à ª®¤®¢ ¯®¤¤¥à¦¨¢ ¥âáï â ¡«¨æ Table, ¢ ª®â®à®© ¯® í⮬㠮¬¥àã (¢å®¤ã) ᮤ¥à¦¨âáï á«¥¤ãîé ï ¨ä®à¬ æ¨ï:
- ¤«ï ⨯ - ¥£® à §¬¥à;
- ¤«ï ¯¥à¥¬¥®© - ¤à¥á;
- ¤«ï ¯®«ï § ¯¨á¨ - ᬥ饨¥ ¢ãâਠ§ ¯¨á¨;
- ¤«ï ¯à®æ¥¤ãàë - à §¬¥à «®ª «ìëå;
- ¤«ï ¤¨ ¯ §® ¨¤¥ªá®¢ ¬ áᨢ - § 票¥ «¥¢®© £à ¨æë.
”ãªæ¨ï IncTab ¢ëà ¡ âë¢ ¥â 㪠§ ⥫ì (¢å®¤) ®¢ë© í«¥¬¥â â ¡«¨æë, ¯à®¢¥àïï ¯à¨ í⮬ «¨ç¨¥ ᢮¡®¤®© ¯ ¬ïâ¨.
’ ¡«¨æ LevelTab - íâ® â ¡«¨æ ã஢¥© ¯à®æ¥¤ãà, ᮤ¥à¦ é ï 㪠§ ⥫¨ ¯®á«¥¤®¢ â¥«ì® ¢«®¦¥ë¥ ¯à®æ¥¤ãàë (á¬. à¨á. 4.9).
„«ï ¢ëç¨á«¥¨ï ¤à¥á®¢ ®¯à¥¤¥«¨¬ ¤«ï ª ¦¤®£® ®¡ê¥¨ï ¤¢ á¨â¥§¨à㥬ëå âਡãâ : DISP ¡ã¤¥â ®¡®§ ç âì ᬥ饨¥ ¢ãâਠ®¡« á⨠¯à®æ¥¤ãàë (¨«¨ ¥¤¨¨æë ª®¬¯¨«ï樨), SIZE - à §¬¥à. ’®£¤ ᥬ ⨪ ¯à ¢¨« ¤«ï ᯨ᪠®¡ê¥¨© ¯à¨¨¬ ¥â ¢¨¤
RULE
DeclPart ::= ( Decl )
SEMANTICS
Disp<1>:=0;
1A: Disp<1>:=Disp<1>+Size<1>;
Size<0>:=Disp<1>.
�â® ¬®¦® á«¥¤ãî騬 ®¡à §®¬ ¨§®¡à §¨âì ¤¥à¥¢¥ ®¡ê¥¨© (à¨á. 8.10).
DeclPart ³ Size <ÄÄÄÄÄÄÄÄÄÄ¿
/³\ ³
/ ³ \ ³
/ ³ \ ³
/ ³ \ ³
/ ³ \ ³
Decl Decl Decl ³
DispÄÄÄÄÄ>DispÄÄÄÄÄÄÄÄÄ>Disp
+ Size + Size + Size
^ ^ ^
| | |
�¨á. 8.10
‚ᥠ®¡ê¥¨ï, ªà®¬¥ ®¡ê¥¨© ¯¥à¥¬¥ëå, ¨¬¥îâ ã«¥¢®© à §¬¥à. � §¬¥à ®¡ê¥¨ï ¯¥à¥¬¥®© ®¯à¥¤¥«ï¥âáï á«¥¤ãî騬 ¯à ¢¨«®¬:
RULE
Decl ::= 'VAR' TypeDes
SEMANTICS
var Entry:Tablentry;
0: Entry:=IncTab;
Size<0>:=((Table[VAL<2>]+1) DIV 2)*2;
{ ‚ëà ¢¨¢ ¨¥ £à ¨æã á«®¢ }
Table[Entry]:=Disp<0>+Size<0>.
‚ ª ç¥á⢥ ¯à¨¬¥à âà á«ï樨 ®¯à¥¤¥«¥¨ï ⨯ à áᬮâਬ ®¡à ¡®âªã ®¯¨á ¨ï § ¯¨á¨:
RULE
TypeDes ::= 'REC' ( TypeDes ) 'END'
SEMANTICS
var Disp:word;
Temp:Tablentry;
0: Entry<0>:=IncTab;
Disp:=0;
2A: begin Temp:=IncTab;
Table[Temp]:=Disp;
Disp:=Disp+Table[Entry<2>]+1) div 2)*2;
{ ‚ëà ¢¨¢ ¨¥ £à ¨æã á«®¢ }
end;
Table[Entry<0>]:=Disp.
8.4. ’à á«ïæ¨ï ¯¥à¥¬¥ëå.
�¥à¥¬¥ë¥ ®âà ¦ î⠢ᥠ¬®£®®¡à §¨¥ ¬¥å ¨§¬®¢ ¤®áâ㯠¢ ï§ëª¥. �¥à¥¬¥ ï ¨¬¥¥â á¨â¥§¨à®¢ ë© âਡãâ ADDRESS - íâ® § ¯¨áì, ®¯¨áë¢ îé ï ¤à¥á ¢ ª®¬ ¤¥ Œ‘68020. �â®â âਡãâ ᮯ®áâ ¢«ï¥âáï ¢á¥¬ ¥â¥à¬¨ « ¬, ¯à¥¤áâ ¢«ïî騬 § 票ï. ‚ á¨á⥬¥ ª®¬ ¤ Œ‘68020 ¬®£® ᯮᮡ®¢ ¤à¥á 樨, ¨ ®¨ ®âà ¦¥ë ¢ áâàãªâãॠ§ 票ï âਡãâ ADDRESS, ¨¬¥î饣® á«¥¤ãî騩 ⨯:
Register=
(D0,D1,D2,D3,D4,D5,D6,D7,A0,A1,A2,A3,A4,A5,A6,SP,NO);
AddrType=record
AddrMode:(D,A,Post,Pre,Direct,IndPre,IndPost,
DirPC,IndPrePC,IndPostPC,Abs,Imm);
Addreg,IndexREG:Register;
IndexDisp,AddrDisp:cardinal;
Scale:1..8;
end;
‡ 票¥ ॣ¨áâà NO ®§ ç ¥â, ç⮠ᮮ⢥âáâ¢ãî騩 ॣ¨áâà ¢ ¤à¥á 樨 ¥ ¨á¯®«ì§ã¥âáï.
„®áâ㯠ª ¯¥à¥¬¥ë¬ ®áãé¥á⢫ï¥âáï ¢ § ¢¨á¨¬®á⨠®â ¨å ã஢ï: £«®¡ «ìë¥ ¯¥à¥¬¥ë¥ ¤à¥áãîâáï á ¯®¬®éìî ¡á®«î⮩ ¤à¥á 樨; ¯¥à¥¬¥ë¥ ¯à®æ¥¤ãàë ⥪ã饣® ãà®¢ï ¤à¥áãîâáï ç¥à¥§ ॣ¨áâà ¡ §ë €6.
…᫨ á⥪ ®à£ ¨§®¢ á ¯®¬®éìî áâ â¨ç¥áª®© 楯®çª¨, â® ¯¥à¥¬¥ë¥ ¯à¥¤ë¤ã饣® áâ â¨ç¥áª®£® ãà®¢ï ¤à¥áãîâáï ç¥à¥§ ॣ¨áâà áâ â¨ç¥áª®© 楯®çª¨ €5; ¯¥à¥¬¥ë¥ ®áâ «ìëå ã஢¥© ¤à¥áãîâáï "¯à®¡¥£ ¨¥¬" ¯® áâ â¨ç¥áª®© 楯®çª¥ á ¨á¯®«ì§®¢ ¨¥¬ ¢á¯®¬®£ ⥫쮣® ॣ¨áâà . €¤à¥á ¯¥à¥¬¥®© ä®à¬¨àã¥âáï ¯à¨ ®¡à ¡®âª¥ áâàãªâãàë ¯¥à¥¬¥®© á«¥¢ ¯à ¢® ¨ ¯¥à¥¤ ¥âáï á ç « ᢥàåã ¢¨§ ª ª á«¥¤ã¥¬ë© âਡãâ ¥â¥à¬¨ « VarTail, § ⥬ ¯¥à¥¤ ¥âáï ᨧã-¢¢¥àå ª ª £«®¡ «ìë© âਡãâ ¥â¥à¬¨ « Variable. ’ ª¨¬ ®¡à §®¬, ¯à ¢¨«® ¤«ï ®¡à é¥¨ï ª ¯¥à¥¬¥®© ¨¬¥¥â ¢¨¤ (¯¥à¢®¥ ¢å®¦¤¥¨¥ Number ¢ ¯à ¢ãî ç áâì - íâ® ã஢¥ì ¯¥à¥¬¥®©, ¢â®à®¥ - ¥¥ ‹¨¤¥à-®¬¥à):
RULE
Variable ::= VarMode Number Number VarTail
SEMANTICS
var Temp:integer;
AddrTmp1,AddrTmp2:AddrType;
3: if (Val<2>=0) then { ƒ«®¡ «ì ï ¯¥à¥¬¥ ï }
Address<4>.AddrMode:=Abs;
Address<4>.AddrDisp:=0;
else { ‹®ª «ì ï ¯¥à¥¬¥ ï }
Address<4>.AddrMode:=Direct;
if (Val<2>=Level<Block>) then
{ �¥à¥¬¥ ï ⥪ã饣® ã஢ï }
Address<4>.Addreg:=A6
elsif (Val<2>=Level<Block>-1) then
{ �¥à¥¬¥ ï ¯à¥¤ë¤ã饣® ã஢ï }
Address<4>.Addreg:=A5;
else Address<4>.Addreg
:=GetFree(RegSet<Block>);
with AddrTmp1 do
AddrMode=Direct;
Addreg=A5;
IndexReg=No;
AddrDisp=0;
end;
Emit2(MOVEA,AddrTmp1,Address<4>.Addreg);
AddrTmp1.Addreg;=Address<4>.Addreg;
AddrTmp2.AddrMode=A;
AddrTmp2.Addreg=Address<4>.Addreg;
for Temp:=Level<Block>-Val<2> do
Emit2(MOVEA,AddrTmp1,AddrTmp2)
end end;
if (Val<2>=Level<Block>) then
Address<4>.AddrDisp:=Table[Val<3>]
else Address<4>.AddrDisp:=Table[Val<3>]
+Table[LevelTAB[Val<2>]].
end end.
”ãªæ¨ï GetFree ¢ë¡¨à ¥â ®ç¥à¥¤®© ᢮¡®¤ë© ॣ¨áâà («¨¡® ॣ¨áâà ¤ ëå, «¨¡® ¤à¥áë© à¥£¨áâà) ¨ ®â¬¥ç ¥â ¥£® ª ª ¨á¯®«ì§®¢ ë© ¢ âਡã⥠RegSet ¥â¥à¬¨ « Block. �à®æ¥¤ãà Emit2 £¥¥à¨àã¥â ¤¢ãå ¤à¥áãî ª®¬ ¤ã. �¥à¢ë© ¯ à ¬¥âà í⮩ ¯à®æ¥¤ãàë - ª®¤ ª®¬ ¤ë, ¢â®à®© ¨ âà¥â¨© ¯ à ¬¥âàë ¨¬¥îâ ⨯ Address ¨ á«ã¦ â ®¯¥à ¤ ¬¨ ª®¬ ¤ë (§¤¥áì ¤«ï ã¯à®é¥¨ï ¨§«®¦¥¨ï ¢ ª ç¥á⢥ ¯ à ¬¥â஢ í⮩ ¯à®æ¥¤ãàë ¨á¯®«ì§ãîâáï ª®âàãªæ¨¨ ⨯ '(€)'; ¨¬¥¥âáï ¢ ¢¨¤ã ª®á¢¥ ï ¤à¥á æ¨ï ç¥à¥§ ¤à¥áë© à¥£¨áâà). ‘¬¥é¥¨¥ ¯¥à¥¬¥®© ⥪ã饣® ãà®¢ï ®âáç¨âë¢ ¥âáï ®â ¡ §ë (€6), ¤à㣨å ã஢¥© - ®â 㪠§ ⥫ï áâ â¨ç¥áª®© 楯®çª¨, ¯®í⮬㠮® ®¯à¥¤¥«ï¥âáï ª ª «£¥¡à ¨ç¥áª ï á㬬 LOCALSize ¨ ¢¥«¨ç¨ë á¬¥é¥¨ï ¯¥à¥¬¥®© (®âà¨æ ⥫쮣®!).
…᫨ á⥪ ®à£ ¨§®¢ á ¯®¬®éìî ¤¨á¯«¥ï, â® âà á«ïæ¨ï ¤«ï ¤®áâ㯠ª ¯¥à¥¬¥ë¬ ¬®¦¥â ¡ëâì ®áãé¥á⢫¥ á«¥¤ãî騬 ®¡à §®¬:
RULE
Variable ::= VarMode Number Number VarTail
SEMANTICS
var Temp:integer;
3: if (Val<2>=0) then { ƒ«®¡ «ì ï ¯¥à¥¬¥ ï }
Address<4>.AddrMode:=Abs;
Address<4>.AddrDisp:=0;
else { ‹®ª «ì ï ¯¥à¥¬¥ ï }
Address<4>.AddrMode:=Direct;
if (Val<2>=Level<Block>) then
{ �¥à¥¬¥ ï ⥪ã饣® ã஢ï }
Address<4>.Addreg:=A6;
Address<4>.AddrDisp:=Table[Val<3>]
else with Address<4> do
AddrMode=IndPost; Addreg:=NO; IndexREG:=NO;
AddrDisp:=DispLAY[Val<2>];
IndexDisp:=Table[Val<3>]
end end end.
� áᬮâਬ âà á«ïæ¨î ¤®áâ㯠ª ¯®«ï¬ § ¯¨á¨. Ž ®¯¨áë¢ ¥âáï á«¥¤ãî騬 ¯à ¢¨«®¬ (Number - íâ® ‹¨¤¥à-®¬¥à ®¯¨á ¨ï ¯®«ï):
RULE
VarTail ::= 'FIL' Number VarTail
SEMANTICS
if (Address<0>.AddrMode=Abs) then
Address<3>.AddrMode:=Abs;
Address<3>.AddrDisp
:=Address<0>.AddrDisp+Table[Val<2>];
else Address<3>:=Address<0>;
if (Address<0>.AddrMode=Direct)
then Address<3>.AddrDisp
:=Address<0>.AddrDisp+Table[Val<2>]
else Address<3>.IndexDisp
:=Address<0>.IndexDisp+Table[Val<2>]
end end.
‘¬¥é¥¨¥ ¢ á«ãç ¥ ¡á®«î⮩ ¨ ¯àאַ© ¤à¥á 樨 ®¯à¥¤¥«ï¥âáï ¯®«¥¬ AddrDisp, ¢ ®áâ «ìëå á«ãç ïå - ¯®«¥¬ IndexDisp. ’ ª¨¬ ®¡à §®¬, ¢¨¤®, çâ® ¯à¨ ®¡à ¡®âª¥ ¯®«¥© § ¯¨á¥© ¨¤¥â ⮫쪮 ª®¯«¥¨¥ á¬¥é¥¨ï ¯®«ï ¡¥§ £¥¥à 樨 ª ª¨å-«¨¡® ª®¬ ¤.
€âਡãâë¥ § ¢¨á¨¬®á⨠¤«ï í⮣® ¯à ¢¨« ¬®£ãâ ¡ëâì ¨§®¡à ¦¥ë á«¥¤ãî騬 ®¡à §®¬ (à¨á. 8.11):
VarTail ³ DispÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ ³
/ \ ³
/ \ ³
/ \ ³
ÚÄÄÄÄÄÄÄÄNumber VarTail | Disp <ÄÄÙ
³ ^
³ Table ³
³ ³ÄÄÄÄÄÄÄ´ ³
ÀÄÄÄÄÄÄÄÄÄÄÄ>³ Disp ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ÃÄÄÄÄÄÄÄ´
�¨á. 8.11
� áᬮâਬ ⥯¥àì ¢ë¡®àªã í«¥¬¥â ¬ áᨢ . ‹¨¤¥à-á¨â ªá¨á ®¡à é¥¨ï ª í«¥¬¥âã ¬ áᨢ á«¥¤ãî騩:
VarTail ::= 'ARR' Number Typexpr VarTail
‡¤¥áì Number - ‹¨¤¥à ®¬¥à ®¯¨á ¨ï ¤¨ ¯ §® ¨¤¥ªá®¢; Typexpr - ¨¤¥ªá®¥ ¢ëà ¦¥¨¥. �® ¤à¥áã «¥¢®© ç á⨠¯à ¢¨« , ¯à¥¤áâ ¢«ïî饩 ¯¥à¥¬¥ãî-¬ áᨢ, ®â ª®â®à®£® ¡¥à¥âáï ¨¤¥ªá, ¨ ¯® ¨¤¥ªá®¬ã ¢ëà ¦¥¨î, ¯à¥¤áâ ¢«¥®¬ã ¥â¥à¬¨ «®¬ Typexpr, ¬ë ¤®«¦ë áä®à¬¨à®¢ âì ¤à¥á í«¥¬¥â ¬ áᨢ . ‚ ¯à¨¢¥¤¥®© ¨¦¥ â ¡«¨æ¥ à¥è¥¨© äãªæ¨ï GetAddr ¢ë¡¨à ¥â ®ç¥à¥¤®© ᢮¡®¤ë© ¤à¥áë© à¥£¨áâà.
’¨¯ ¤à¥á 樨 VarTail «¥¢®© ç áâ¨:
IndPre or Direct (IndPost or Abs) or
IndexReg=NO ((Direct or IndPre)
& (IndexReg<>NO))
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ElSize<3>= ³ AddrDisp<4>:= ³AddrDisp<4>:=
1,2,4,8 ³ AddrDisp<0> ³-Left<2>*ElSize<3> AddrMode<3>=D ³ -Left<2>*ElSize<3> ³AddrMode<4>:=IndPost
³ Addreg<4>:=Addreg<0>³Addreg<4>:=
³ IndexReg<4>:= ³if Addreg<0> à ¡®ç¨©
³ Addreg<3> ³then Addreg<0>
³ AddrMode<4>:=IndPost³else GetAddr
³ Scale<4>:=ElSize<3> ³IndexReg<4>:=
³ ³ Addreg<3>
³ ³Scale<4>:=ElSize<3>
³ ³-------------------
³ ³LEA Address<0>,
³ ³ Address<4>
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ