cradle5.mod 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. MODULE cradle5;
  2. (*
  3. Adding push and pop to allow multiplication and division and ()
  4. Adding [64 BITS]
  5. Converting to 64 bits (using rax instad of eax
  6. Adding bss zone
  7. *)
  8. IMPORT SYSTEM, Strings, InOut,WholeStr, CharClass, FIO ;
  9. CONST
  10. TAB = CHR(9);
  11. VAR
  12. Look : CHAR;
  13. ErrorCode : CARDINAL;
  14. chaine : ARRAY[0..255] OF CHAR;
  15. nomFichier : ARRAY [0..255] OF CHAR;
  16. fichier : FIO.File;
  17. PROCEDURE GetChar;
  18. BEGIN
  19. InOut.Read(Look)
  20. END GetChar;
  21. PROCEDURE Error (s : ARRAY OF CHAR);
  22. BEGIN
  23. InOut.WriteLn;
  24. InOut.Write(CHR(8));
  25. InOut.Write(TAB);
  26. InOut.WriteString("Error : ");
  27. InOut.WriteString(s);
  28. InOut.Write(".");
  29. END Error;
  30. PROCEDURE Abort (s : ARRAY OF CHAR);
  31. BEGIN
  32. Error(s);
  33. HALT
  34. END Abort;
  35. PROCEDURE Expected (s : ARRAY OF CHAR);
  36. VAR
  37. chaine : ARRAY [0..255] OF CHAR;
  38. BEGIN
  39. Strings.Concat(s, " Expected ",chaine);
  40. Abort (chaine)
  41. END Expected;
  42. PROCEDURE Match ( x : CHAR );
  43. BEGIN
  44. IF Look = x THEN
  45. GetChar
  46. ELSE
  47. Strings.Concat("''",Strings.String1(x),chaine);
  48. Strings.Concat(chaine, "''", chaine);
  49. Expected(chaine)
  50. END;
  51. END Match;
  52. PROCEDURE IsAlpha (c : CHAR ) : BOOLEAN;
  53. BEGIN
  54. RETURN CharClass.IsUpper(CAP(c))
  55. END IsAlpha;
  56. PROCEDURE IsDigit (c : CHAR) : BOOLEAN;
  57. BEGIN
  58. RETURN CharClass.IsNumeric(c)
  59. END IsDigit;
  60. PROCEDURE GetName (VAR s : ARRAY OF CHAR);
  61. BEGIN
  62. IF NOT IsAlpha(Look) THEN
  63. ErrorCode := 1;
  64. Expected('Name');
  65. END;
  66. Strings.Assign(Strings.String1(CAP(Look)),s);
  67. GetChar;
  68. END GetName;
  69. PROCEDURE GetNum (VAR c : CHAR);
  70. BEGIN
  71. IF NOT IsDigit(Look) THEN
  72. ErrorCode := 1;
  73. Expected('Integer');
  74. END;
  75. c := Look;
  76. GetChar;
  77. END GetNum;
  78. PROCEDURE Emit (s : ARRAY OF CHAR);
  79. BEGIN
  80. FIO.WriteString(fichier,s);
  81. END Emit;
  82. PROCEDURE EmitLn (s : ARRAY OF CHAR );
  83. BEGIN
  84. FIO.WriteString(fichier,s);
  85. FIO.WriteLine(fichier);
  86. END EmitLn;
  87. (****************** début du parseur *************)
  88. PROCEDURE Term;
  89. VAR
  90. c : CHAR;
  91. BEGIN
  92. GetNum(c);
  93. Strings.Concat(TAB,"mov rax,", chaine);
  94. Strings.Concat(chaine, Strings.String1(c), chaine);
  95. EmitLn(chaine)
  96. END Term;
  97. PROCEDURE Add;
  98. BEGIN
  99. Match('+');
  100. Term;
  101. (*Strings.Concat(TAB,"add eax, ebx", chaine);*)
  102. Strings.Concat(TAB,"pop rbx", chaine);
  103. EmitLn(chaine);
  104. Strings.Concat(TAB,"add rax, rbx", chaine);
  105. EmitLn(chaine);
  106. END Add;
  107. PROCEDURE Substract;
  108. BEGIN
  109. Match ('-');
  110. Term;
  111. Strings.Concat(TAB,"pop rbx", chaine);
  112. EmitLn(chaine);
  113. Strings.Concat(TAB,"sub rax, rbx", chaine);
  114. EmitLn(chaine);
  115. Strings.Concat(TAB,"neg rax", chaine);
  116. EmitLn(chaine);
  117. END Substract;
  118. PROCEDURE Expression;
  119. BEGIN
  120. Term;
  121. WHILE (Look = '+') OR (Look = '-') DO
  122. (* EmitLn('MOVE D0,D1'); version 1 *)
  123. (* EmitLn('MOVE D0,-(SP)'); version utilisant la pile *)
  124. Strings.Concat(TAB,"push rax",chaine);
  125. EmitLn(chaine);
  126. CASE Look OF
  127. '+' : Add; |
  128. '-' : Substract;
  129. ELSE
  130. Expected ("Addop ");
  131. END;
  132. END;
  133. END Expression;
  134. (*********************** fin du parseur ***********)
  135. PROCEDURE EndCompile;
  136. BEGIN
  137. (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
  138. Strings.Concat(TAB, "mov rdi,rax", chaine);
  139. EmitLn(chaine);
  140. Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
  141. EmitLn(chaine);
  142. Strings.Concat(TAB,"syscall",chaine);
  143. EmitLn(chaine);
  144. FIO.Close(fichier)
  145. END EndCompile;
  146. PROCEDURE Init;
  147. VAR
  148. OK : BOOLEAN;
  149. BEGIN
  150. (* création d'un fichier asm *)
  151. nomFichier := "cradleasm5.asm";
  152. fichier := FIO.OpenForRandom(nomFichier,TRUE,TRUE );
  153. IF NOT FIO.IsNoError(fichier) THEN
  154. InOut.WriteString("Echec de création du fichier asm");
  155. HALT
  156. END;
  157. ErrorCode := 0;
  158. GetChar;
  159. EmitLn("[BITS 64]");
  160. EmitLn("");
  161. EmitLn("; begining of the assembly program");
  162. EmitLn("");
  163. EmitLn("%define SYS_EXIT 60");
  164. EmitLn("%define SYS_WRITE 1");
  165. EmitLn("%define STD_IN 0");
  166. EmitLn("%define STD_OUT 1");
  167. EmitLn("%define STD_ERR 2");
  168. EmitLn("");
  169. EmitLn("section .bss");
  170. EmitLn("; nada");
  171. EmitLn("");
  172. EmitLn("section .data");
  173. EmitLn("");
  174. EmitLn("section .text");
  175. EmitLn("global _start");
  176. EmitLn("");
  177. EmitLn("_start:");
  178. END Init;
  179. BEGIN
  180. InOut.WriteString("Début de compilation");
  181. InOut.WriteLn;
  182. InOut.WriteString("Entrez le source : ");
  183. Init;
  184. Expression;
  185. EndCompile;
  186. END cradle5.