CODGEN (Материалы к контрольным работам), страница 2
Описание файла
Файл "CODGEN" внутри архива находится в следующих папках: Материалы к контрольным работам, Материалы (3), CONSCOMP. Документ из архива "Материалы к контрольным работам", который расположен в категории "". Всё это находится в предмете "конструирование компиляторов" из 6 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "CODGEN"
Текст 2 страницы из документа "CODGEN"
ElSize<3> ³ AddrDisp<4>:= ³ AddrDisp<4>:=
<>1,2,4,8 ³ AddrDIP<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>
³ Scale<4>:=1 ³ else GetAddr
³ AddrMode<4>:=IndPost³ IndexReg<4>:=
³---------------------³ Addreg<3>
³ MUL ElSize<3>, ³ Scale:=1
³ Addreg<3> ³-------------------
³ ³ LEA Address<0>,
³ ³ Address<4>
³ ³ MUL ElSize<4>,
³ ³ IndexReg<4>
ÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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>:=GetFree³ if Addreg<0> à ¡®ç¨©
³AddrMode<4>:=IndPost³ then Addreg<0>
³Scale<4>:=ElSize<3> ³ else GetAddr
³--------------------³ IndexReg<4>:=GetFree
³MOVE Address<3>, ³ Scale<4>:=ElSize<3>
³ IndexReg<4> ³-------------------
³ ³ LEA Address<0>,
³ ³ Address<4>
³ ³ MOVE Address<3>,
³ ³ IndexReg<4>
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ElSize<3> ³AddrDisp<4>:= ³ AddrDisp<4>:=
<>1,2,4,8 ³AddrDisp<0>- ³ -Left<2>*ElSize
AddrMode<3><>D³Left<2>*ElSize<3> ³ AddrMode<4>:=IndPre
³Addreg<4>:=Addreg<0>³ Addreg<4>:=
³IndexReg<4>:=GetFree³ if Addreg<0> à ¡®ç¨©
³ AddrMode<4>:=IndPre³ then Addreg<0>
³ Scale<4>:=ElSize<3>³ else GetAddr
³--------------------³ IndexReg<4>:=GetFree
³MOVE Address<3>, ³ Scale<4>:=1
³ IndexReg<4> ³----------------
³ MUL ElSize<3>, ³ LEA Address<0>,
³ IndexReg<4> ³ Address<4>
³ ³ MOVE Address<3>,
³ ³ IndexReg<4>
³ ³ MUL ElSize<3>,
³ ³ IndexReg<4>
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
�®¤ "à ¡®ç¨¬" ॣ¨áâ஬ ¢ â ¡«¨æ¥ à¥è¥¨© ¨¬¥¥âáï ¢ ¢¨¤ã ॣ¨áâà, § 票¥ ª®â®à®£® ¬®¦¥â ¡ëâì ¨á¯®à祮 (¯à¨¬¥à®¬ "¥ à ¡®ç¥£®" ॣ¨áâà ¬®¦¥â á«ã¦¨âì ॣ¨áâà €6 ¨«¨ ॣ¨áâà €5, ¥á«¨ ® ¨á¯®«ì§ã¥âáï ª ª 㪠§ â¥«ì ¯à®æ¥¤ãàë ¯à¥¤ë¤ã饣® áâ â¨ç¥áª®£® ã஢ï).
MaxReg - ¬ ªá¨¬ «ìë© ®¬¥à ¤à¥á®£® ॣ¨áâà , ª®â®àë¬ ¬®¦® ¯®«ì§®¢ âìáï ª ª à ¡®ç¨¬. ‚ᥠ¤à¥áë¥ à¥£¨áâàë à §¤¥«¥ë ¤¢ ¬®¦¥á⢠: ¨¬¥î騥 ®¬¥à , ¡®«ì訥 MaxReg, § ïâë ¯à¥¤¢ à¨â¥«ìë¬ à á¯à¥¤¥«¥¨¥¬, ®áâ «ìë¥ - à ¡®ç¨¥. ”ãªæ¨ï GetAddr ¢ë¤ ¥â ®ç¥à¥¤®© ᢮¡®¤ë© à ¡®ç¨© ¤à¥áë© à¥£¨áâà. �ਢ¥¤¥ ï â ¡«¨æ ॠ«¨§ã¥âáï á«¥¤ãî騬 ¯à ¢¨«®¬:
RULE
VarTail ::= 'ARR' Number Typexpr VarTail
SEMANTICS
Size:integer;
Flag:boolean;
AddrTmp1,AddrTmp2:AddrType;
Flag:= ((Address<0>.AddrMode=IndPre)
or (Address<0>.AddrMode=Direct))
and (Address<0>.IndexReg=NO);
Size:=Table[Val<2>];
if (Address<3>.AddrMode=D)
then IndexReg<4>:=Addreg<3>
else IndexReg<4>:=GetFree;
end;
AddrMode<4>:=IndPre;
if Flag then
Address<4>.AddrDisp
:=Address<0>.AddrDisp
-Table[Val<2>]*Size;
Addreg<4>:=Addreg<0>;
else Address<4>.AddrDisp:=
-Table[Val<2>]*Size;
if (Address<0>.Addreg<=MaxReg)
then Addreg<4>:=Addreg<0>
else Addreg<4>:=GetAddr;
end end;
if (Size in [2,4,8])
then Address<4>.Scale:=Size)
else Address<4>.Scale:=1;
end;
AddrTmp1.AddrMode:=D; AddrTmp1.Addreg:=IndexReg<4>;
if Flag then Emit2(LEA,Address<0>,Address<4>) end;
if (Address<3>.AddrMode<>D)
then Emit2(MOVE,Address<3>,AddrTmp1);
end;
AddrTmp2.AddrMode:=IMM; AddrTmp2.AddrDisp:=ElSize<3>;
if not (Size IN [1,2,4,8])
then Emit2(MUL,AddrTmp2,AddrTmp1);
end.
8.5. ’à á«ïæ¨ï 楫ëå ¢ëà ¦¥¨©
’à á«ïæ¨ï ¢ëà ¦¥¨© à §«¨çëå ⨯®¢ ã¯à ¢«ï¥âáï á¨â ªá¨ç¥áª¨ ¡« £®¤ àï «¨ç¨î 㪠§ ⥫ï ⨯ ¯¥à¥¤ ª ¦¤®© ®¯¥à 樥©. Œë à áᬮâਬ ¥ª®â®àë¥ ¨¡®«¥¥ å à ªâ¥àë¥ ¯à®¡«¥¬ë £¥¥à 樨 ª®¤ ¤«ï ¢ëà ¦¥¨©.
‘¨á⥬ ª®¬ ¤ Œ‘68020 ®¡« ¤ ¥â ¤¢ã¬ï ®á®¡¥®áâﬨ, ᪠§ë¢ î騬¨áï £¥¥à 樨 ª®¤ ¤«ï à¨ä¬¥â¨ç¥áª¨å ¢ëà ¦¥¨© (â® ¦¥ ¬®¦® ᪠§ âì ¨ ® £¥¥à 樨 ª®¤ ¤«ï ¢ëà ¦¥¨© ⨯ "¬®¦¥á⢠"):
1) ®¤¨ ¨§ ®¯¥à ¤®¢ ¢ëà ¦¥¨ï (¯à ¢ë©) ¤®«¦¥ ¯à¨ ¢ë¯®«¥¨¨ ®¯¥à 樨 室¨âìáï ॣ¨áâà¥, ¯®í⮬㠥᫨ ®¡ ®¯¥à ¤ ¥ ॣ¨áâà å, â® ¯¥à¥¤ ¢ë¯®«¥¨¥¬ ®¯¥à 樨 ®¤¨ ¨§ ¨å ¤® § £à㧨âì ॣ¨áâà;
2) á¨á⥬ ª®¬ ¤ ¤®¢®«ì® "ᨬ¬¥âà¨ç ", â.¥. ¥â á¯¥æ¨ «ìëå âॡ®¢ ¨© ª ॣ¨áâà ¬ ¯à¨ ¢ë¯®«¥¨¨ ®¯¥à 権 (â ª¨å, ¯à¨¬¥à, ª ª ¯ àë ॣ¨áâ஢ ¨«¨ âॡ®¢ ¨ï ç¥â®á⨠¨ â.¤.).
�®íâ®¬ã ¢ë¡®à ª®¬ ¤ ¯à¨ £¥¥à 樨 à¨ä¬¥â¨ç¥áª¨å ¢ëà ¦¥¨© ®¯à¥¤¥«ï¥âáï ¤®¢®«ì® ¯à®áâ묨 â ¡«¨æ ¬¨ à¥è¥¨©. � ¯à¨¬¥à, ¤«ï 楫®ç¨á«¥®£® á«®¦¥¨ï â ª ï â ¡«¨æ ¯à¨¢¥¤¥ à¨á.8.12.
�à ¢ë© ®¯¥à ¤ €2
R V
ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄ¿
‹¥¢ë© ³ R ³ ADD A1,A2 ³ ADD A2,A1 ³
®¯¥à ¤ ÃÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄ´
A1 ³ V ³ ADD A1,A2 ³ MOVE A1,R ³
³ ³ ³ ADD A2,R ³
ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÙ
�¨á. 8.12
‡¤¥áì ¨¬¥¥âáï ¢ ¢¨¤ã, çâ® R - ®¯¥à ¤ ॣ¨áâà¥, V - ®¯¥à ¤ - ¯¥à¥¬¥ ï ¨«¨ ª®áâ â . ’ ª ï â ¡«¨æ à¥è¥¨© ¤®«¦ â ª¦¥ ãç¨âë¢ âì ª®¬¬ãâ ⨢®áâì ®¯¥à 権. �â â ¡«¨æ à¥è¥¨© ॠ«¨§ã¥âáï á«¥¤ãî騬 ¯à ¢¨«®¬:
RULE
IntExpr ::= 'PLUS' IntExpr IntExpr
SEMANTICS
if (Address<2>.AddrMode<>D)
and (Address<3>.AddrMode<>D) then
Address<0>.AddrMode:=D;
Address<0>.Addreg:=GetFree(RegSet<Block>);
Emit2(MOVE,Address<2>,Address<0>);
Emit2(ADD,Address<2>,Address<0>);
else if (Address<2>.AddrMode=D) then
Emit2(ADD,Address<3>,Address<2>);
Address<0>:=Address<2>);
else Emit2(ADD,Address<2>,Address<3>);
Address<0>:=Address<3>);
end end.