瀏覽代碼

correction de MUL et DIV

Eric Streit 4 月之前
父節點
當前提交
461df765e5

+ 5 - 1
LinuxAMD64/cradle0.mod

@@ -1,6 +1,8 @@
 MODULE cradle0;
 
-(* squelette du compilateur avec génération du code de sortie propre en amd64 *)
+(* squelette du compilateur avec génération du code de sortie propre en amd64      *)
+(* on entre une valeur entière et il donne la valeur dans son code de sortie       *)
+(* à examiner avec : echo $?                                                       *)
 
 IMPORT SYSTEM, Strings, InOut,WholeStr, CharClass ;
 
@@ -108,6 +110,8 @@ BEGIN
   InOut.WriteLn;
 END EmitLn;
 
+(********************************************)
+
 PROCEDURE EndCompile;
 
 VAR 

二進制
LinuxAMD64/cradle1


+ 5 - 8
LinuxAMD64/cradle1.mod

@@ -4,7 +4,6 @@ MODULE cradle1;
 (* on entre une valeur entière et il donne la valeur dans son code de sortie       *)
 (* à examiner avec : echo $?                                                       *)
 (* gère les erreurs de saisie                                                      *)
-(* par contre permet la saisie de plusieurs caractères... ce qui n'est pas correct *)
 
 (* <term> ::= digit                                                                *)
 
@@ -126,12 +125,10 @@ VAR
 
 BEGIN 
   GetNum(c);
-  Strings.Concat(TAB,"mov rbx, ", chaine);
+  Strings.Concat(TAB,"mov rax, ", chaine);
   Strings.Concat(chaine, Strings.String1(c), chaine);
   EmitLn(chaine);
-  (* on met le résultat dans rbx, puis transfert and rdi pour avoir le code de sortie *)
-  Strings.Concat(TAB,"mov rdi, rbx", chaine);
-  EmitLn(chaine)
+ 
 END Expression;
 
 (************ fin du parser ******************)
@@ -142,9 +139,9 @@ VAR
   chaine : ARRAY[0..255] OF CHAR;
   
 BEGIN 
-  (*Strings.Concat(TAB, "mov rdi,",chaine);
-  Strings.Concat(chaine, Strings.String1(Look) , chaine);
-  EmitLn(chaine);*)
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB,"mov rdi, rax", chaine);
+  EmitLn(chaine)
   Strings.Concat(TAB, "mov rax,60",chaine);
   EmitLn(chaine);
   Strings.Concat(TAB,"syscall",chaine);

二進制
LinuxAMD64/cradle2


+ 16 - 14
LinuxAMD64/cradle2.mod

@@ -113,19 +113,7 @@ BEGIN
   InOut.WriteLn;
 END EmitLn;
 
-PROCEDURE EndCompile;
-  
-BEGIN 
-
-  Strings.Concat(TAB, "mov rdi,0",chaine);
-  EmitLn(chaine);
-  Strings.Concat(TAB, "mov rax,60",chaine);
-  EmitLn(chaine);
-  Strings.Concat(TAB,"syscall",chaine);
-  EmitLn(chaine);
-END EndCompile;
-
-
+(**************** Début du parseur *******************************)
 
 PROCEDURE Term;
 
@@ -155,7 +143,7 @@ BEGIN
   Term;
   Strings.Concat(TAB,"sub rax, rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"neg eax", chaine);
+  Strings.Concat(TAB,"neg rax", chaine);
   EmitLn(chaine);
 END Substract;
 
@@ -173,6 +161,20 @@ BEGIN
   END;    
 END Expression;
 
+(********************* Fin du parseur *****************************)
+
+PROCEDURE EndCompile;
+  
+BEGIN 
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB,"mov rdi, rax", chaine);
+  EmitLn(chaine)
+  Strings.Concat(TAB, "mov rax,60",chaine);
+  EmitLn(chaine);
+  Strings.Concat(TAB,"syscall",chaine);
+  EmitLn(chaine);
+END EndCompile;
+
 PROCEDURE Init;
 
 BEGIN 

二進制
LinuxAMD64/cradle3


+ 19 - 12
LinuxAMD64/cradle3.mod

@@ -110,19 +110,11 @@ BEGIN
   InOut.WriteLn;
 END EmitLn;
 
-PROCEDURE EndCompile;
-  
-BEGIN 
-
-  Strings.Concat(TAB, "mov rdi,0",chaine);
-  EmitLn(chaine);
-  Strings.Concat(TAB, "mov rax,60",chaine);
-  EmitLn(chaine);
-  Strings.Concat(TAB,"syscall",chaine);
-  EmitLn(chaine);
-END EndCompile;
-
+(*************************** début du parseur *******************************)
 
+(* <term> ::= digit                                                         *)
+(* <expression> ::= <term> [<addop> <term>]*                                *)
+(* plusieurs opérations permises                                            *)
 
 PROCEDURE Term;
 
@@ -172,6 +164,21 @@ BEGIN
   END;   
 END Expression;
 
+(******************* fin du parseur ***********)
+
+PROCEDURE EndCompile;
+  
+BEGIN 
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB, "mov rdi,rax",chaine);
+  EmitLn(chaine);
+  Strings.Concat(TAB, "mov rax,60",chaine);
+  EmitLn(chaine);
+  Strings.Concat(TAB,"syscall",chaine);
+  EmitLn(chaine);
+END EndCompile;
+
+
 PROCEDURE Init;
 
 BEGIN 

+ 2 - 2
LinuxAMD64/cradle4.mod

@@ -112,8 +112,8 @@ END EmitLn;
 PROCEDURE EndCompile;
   
 BEGIN 
-
-  Strings.Concat(TAB, "mov rdi,0",chaine);
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB, "mov rdi, rax",chaine);
   EmitLn(chaine);
   Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
   EmitLn(chaine);

+ 2 - 2
LinuxAMD64/cradle5.mod

@@ -176,8 +176,8 @@ END Expression;
 PROCEDURE EndCompile;
   
 BEGIN 
-
-  Strings.Concat(TAB, "mov rdi,0",chaine);
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB, "mov rdi,rax", chaine);
   EmitLn(chaine);
   Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
   EmitLn(chaine);

二進制
LinuxAMD64/cradle6


+ 4 - 3
LinuxAMD64/cradle6.mod

@@ -141,7 +141,7 @@ BEGIN
   (*EmitLn('MULS (SP)+,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"imul rax, rbx", chaine);
+  Strings.Concat(TAB,"mul rbx", chaine);
   EmitLn(chaine);
 END Multiply;
 
@@ -156,7 +156,7 @@ BEGIN
   (*EmitLn('DIVS D1,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"div rax, rbx", chaine);
+  Strings.Concat(TAB,"div rbx", chaine);
   EmitLn(chaine);
 END Divide;
 
@@ -267,7 +267,8 @@ END Init;
 PROCEDURE EndCompile;
   
 BEGIN 
-  Strings.Concat(TAB, "mov rdi,0",chaine);
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB, "mov rdi, rax", chaine);
   EmitLn(chaine);
   Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
   EmitLn(chaine);

+ 4 - 3
LinuxAMD64/cradle7.mod

@@ -155,7 +155,7 @@ BEGIN
   (*EmitLn('MULS (SP)+,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"imul rax, rbx", chaine);
+  Strings.Concat(TAB,"mul rbx", chaine);
   EmitLn(chaine);
 END Multiply;
 
@@ -170,7 +170,7 @@ BEGIN
   (*EmitLn('DIVS D1,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"div rax, rbx", chaine);
+  Strings.Concat(TAB,"div rbx", chaine);
   EmitLn(chaine);
 END Divide;
 
@@ -285,7 +285,8 @@ PROCEDURE EndCompile;
 BEGIN 
   EmitLn("");
   EmitLn("; end of program");
-  Strings.Concat(TAB, "mov rdi,0",chaine);
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB, "mov rdi, rax", chaine);
   EmitLn(chaine);
   Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
   EmitLn(chaine);

+ 4 - 3
LinuxAMD64/cradle8.mod

@@ -163,7 +163,7 @@ BEGIN
   (*EmitLn('MULS (SP)+,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"imul rax, rbx", chaine);
+  Strings.Concat(TAB,"mul rbx", chaine);
   EmitLn(chaine);
 END Multiply;
 
@@ -178,7 +178,7 @@ BEGIN
   (*EmitLn('DIVS D1,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"div rax, rbx", chaine);
+  Strings.Concat(TAB,"div rbx", chaine);
   EmitLn(chaine);
 END Divide;
 
@@ -298,7 +298,8 @@ PROCEDURE EndCompile;
 BEGIN 
   EmitLn("");
   EmitLn("; end of program");
-  Strings.Concat(TAB, "mov rdi,0",chaine);
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB, "mov rdi, rax", chaine);
   EmitLn(chaine);
   Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
   EmitLn(chaine);

+ 18 - 14
LinuxAMD64/cradle9.mod

@@ -1,11 +1,11 @@
 MODULE cradle9;
 
-(* Part 3                                             *)
-(* variables and numbers with mutiples digits         *)
+(* Part 3                                                     *)
+(* variables and numbers with mutiples digits                 *)
 
-(* <factor> ::= [+|-]digit | (<expression>)           *)
-(* <expression> ::= <term> [<addop> <term>]*          *)
-(* <term> ::= <factor> [ <mulop> <factor ]*           *)
+(* <factor> ::= [+|-]digit | (<expression>) | <variable>      *)
+(* <expression> ::= <term> [<addop> <term>]*                  *)
+(* <term> ::= <factor> [ <mulop> <factor ]*                   *)
 
 IMPORT SYSTEM, Strings, InOut,WholeStr, CharClass, FIO ;
 
@@ -123,10 +123,10 @@ END EmitLn;
 (*        le parser commence ici *********************)
 (******************************************************)
 
-(* <factor> ::= [+|-]digit | (<expression>)           *)
-(* <expression> ::= <term> [<addop> <term>]*          *)
-(* <term> ::= <factor> [ <mulop> <factor ]*           *)
-(* adding unary sign, + and -                         *)
+(* <factor> ::= [+|-]digit | (<expression>) | <variable>      *)
+(* <expression> ::= <term> [<addop> <term>]*                  *)
+(* <term> ::= <factor> [ <mulop> <factor ]*                   *)
+(* adding unary sign, + and -                                 *)
 
 PROCEDURE Expression; FORWARD;
 
@@ -143,14 +143,17 @@ BEGIN
     Match('(');
     Expression;
     Match(')'); 
-  ELSE   
+  ELSIF IsAlpha(Look) THEN 
+    (*EmitLn('MOVE ' + GetName + '(PC),D0')*)
+    
+  ELSE
     (*  digit *)
     (* EmitLn('MOVE #' + GetNum + ',D0')*)
     GetNum(c);
     Strings.Concat(TAB,"mov rax,", chaine);
     Strings.Concat(chaine, Strings.String1(c), chaine);
     EmitLn(chaine)
-  END  
+  END
 END Factor;
 
 
@@ -163,7 +166,7 @@ BEGIN
   (*EmitLn('MULS (SP)+,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"imul rax, rbx", chaine);
+  Strings.Concat(TAB,"mul rbx", chaine);
   EmitLn(chaine);
 END Multiply;
 
@@ -178,7 +181,7 @@ BEGIN
   (*EmitLn('DIVS D1,D0');*)
   Strings.Concat(TAB,"pop rbx", chaine);
   EmitLn(chaine);
-  Strings.Concat(TAB,"div rax, rbx", chaine);
+  Strings.Concat(TAB,"div rbx", chaine);
   EmitLn(chaine);
 END Divide;
 
@@ -298,7 +301,8 @@ PROCEDURE EndCompile;
 BEGIN 
   EmitLn("");
   EmitLn("; end of program");
-  Strings.Concat(TAB, "mov rdi,0",chaine);
+  (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
+  Strings.Concat(TAB, "mov rdi, rax", chaine);
   EmitLn(chaine);
   Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
   EmitLn(chaine);

二進制
LinuxAMD64/cradleasm3


+ 16 - 0
LinuxAMD64/cradleasm3.asm

@@ -0,0 +1,16 @@
+; begining of the assembly program
+
+section .data
+
+section .text
+global _start
+
+_start:
+	mov rax,7
+	mov rbx, rax
+	mov rax,9
+	add rax, rbx
+	mov rdi,rax
+	mov rax,60
+	syscall
+

+ 27 - 0
LinuxAMD64/cradleasm6.asm

@@ -0,0 +1,27 @@
+[BITS 64]
+
+; begining of the assembly program
+
+%define SYS_EXIT 60
+%define SYS_WRITE 1
+%define STD_IN 0
+%define STD_OUT 1
+%define STD_ERR 2
+
+section .bss
+; nada
+
+section .data
+
+section .text
+global _start
+
+_start:
+	mov rax,4
+	push rax
+	mov rax,5
+	pop rbx
+	add rax, rbx
+	mov rdi, rax
+	mov rax,SYS_EXIT
+	syscall

+ 3 - 2
LinuxAMD64/cradleasm8.asm

@@ -16,9 +16,10 @@ section .bss
 section .data
 
 section .text
-global _start
+global main
 
-_start:
+main:
+    mov rbp, rsp; for correct debugging
 	xor rax, rax
 	push rax
 	mov rax,8