From 33db0e98593b1a020f79688366e22fa81c4a825b Mon Sep 17 00:00:00 2001 From: b21202065 <niels.bauquin@etu.univ-amu.fr> Date: Fri, 22 Mar 2024 17:09:44 +0100 Subject: [PATCH] geg --- src/nasm/C3a2nasm.java | 72 ++++++++++++++++++++++++++++----- test/pre-nasm-ref/add1.pre-nasm | 2 +- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/nasm/C3a2nasm.java b/src/nasm/C3a2nasm.java index 9e9dce5..c159c73 100644 --- a/src/nasm/C3a2nasm.java +++ b/src/nasm/C3a2nasm.java @@ -52,14 +52,41 @@ public class C3a2nasm implements C3aVisitor <NasmOperand> { } public NasmOperand visit(C3aInstCall inst){ - NasmOperand address = (inst.label != null) ? - inst.label.accept(this) - : null; - nasm.ajouteInst(new NasmCall(null, address, "")); + + + NasmRegister register = nasm.newRegister(); + register.colorRegister(Nasm.REG_ESP); + nasm.ajouteInst(new NasmSub(null, register, new NasmConstant(4),"allocation mémoire pour la valeur de retour")); + nasm.ajouteInst(new NasmCall(null, inst.op1.accept(this), "")); + nasm.ajouteInst(new NasmPop(null, inst.result.accept(this),"récupération de la valeur de retour")); return null; } public NasmOperand visit(C3aInstFBegin inst){ + NasmRegister register = nasm.newRegister(); + register.colorRegister(Nasm.REG_EBP); + nasm.ajouteInst(new NasmPush(new NasmLabel(inst.val.getIdentif()), register,"sauvegarde la valeur de ebp")); + + NasmRegister register1 = nasm.newRegister(); + register1.colorRegister(Nasm.REG_ESP); + nasm.ajouteInst(new NasmMov(null, register, register1, "nouvelle valeur de ebp")); + + NasmRegister register2 = nasm.newRegister(); + register2.colorRegister(Nasm.REG_EAX); + nasm.ajouteInst(new NasmPush(null, register,"sauvegarde la valeur de eax")); + + NasmRegister register3 = nasm.newRegister(); + register3.colorRegister(Nasm.REG_EBX); + nasm.ajouteInst(new NasmPush(null, register,"sauvegarde la valeur de ebx")); + + NasmRegister register4 = nasm.newRegister(); + register4.colorRegister(Nasm.REG_ECX); + nasm.ajouteInst(new NasmPush(null, register,"sauvegarde la valeur de ecx")); + + NasmRegister register5 = nasm.newRegister(); + register5.colorRegister(Nasm.REG_EDX); + nasm.ajouteInst(new NasmPush(null, register,"sauvegarde la valeur de edx")); + nasm.ajouteInst(new NasmSub(null, register1, new NasmConstant(0), "allocation des variables locales")); return null; } @@ -117,17 +144,40 @@ public class C3a2nasm implements C3aVisitor <NasmOperand> { return null; } public NasmOperand visit(C3aInstStop inst){ - + NasmRegister register1 = nasm.newRegister(); + register1.colorRegister(Nasm.REG_EBX); + NasmRegister register2 = nasm.newRegister(); + register2.colorRegister(Nasm.REG_EAX); + nasm.ajouteInst(new NasmMov(null, register1, new NasmConstant(0)," valeur de retour du programme")); + nasm.ajouteInst(new NasmMov(null, register2, new NasmConstant(1)," code de sortie")); + nasm.ajouteInst(new NasmInt(null,null)); return null; } - public NasmOperand visit(C3aConstant oper){return null;} - public NasmOperand visit(C3aBooleanConstant oper){return null;} - public NasmOperand visit(C3aLabel oper){return null;} + public NasmOperand visit(C3aConstant oper){ + + + System.out.println(oper.getClass()); + return new NasmConstant(oper.val);} + public NasmOperand visit(C3aBooleanConstant oper){ + System.out.println(oper.getClass()); + return null;} + public NasmOperand visit(C3aLabel oper){ + System.out.println(oper.getClass()); + return null;} public NasmOperand visit(C3aTemp oper){ - return null; + + + System.out.println(oper.getClass()); + return new NasmRegister(oper.num); } - public NasmOperand visit(C3aVar oper){return null;} - public NasmOperand visit(C3aFunction oper){return null;} + public NasmOperand visit(C3aVar oper){ + System.out.println(oper.getClass()); + return null;} + public NasmOperand visit(C3aFunction oper){ + + + System.out.println(oper.getClass()); + return new NasmLabel(oper.val.identif);} } diff --git a/test/pre-nasm-ref/add1.pre-nasm b/test/pre-nasm-ref/add1.pre-nasm index a85129f..ead0968 100644 --- a/test/pre-nasm-ref/add1.pre-nasm +++ b/test/pre-nasm-ref/add1.pre-nasm @@ -9,7 +9,7 @@ _start: sub esp, 4 ;allocation mémoire pour la valeur de retour call main pop @0 ;récupération de la valeur de retour - mov ebx, 0 ; valeur de retour du programme + mov ebx, 0 ; valeur de retour du programme> mov eax, 1 ; code de sortie int 0x80 main : push ebp ;sauvegarde la valeur de ebp -- GitLab