From cb6c4d9b7f555cb5cc5fa0688b11e24cc9f6b711 Mon Sep 17 00:00:00 2001 From: evilolipop Date: Mon, 5 Feb 2024 16:18:30 +0800 Subject: [PATCH] feat(vmtranslator): finished --- vmtranslator/code_writer.go | 10 +- vmtranslator/main.go | 4 +- .../FibonacciElement/FibonacciElement.asm | 32 +- .../FunctionCalls/NestedCall/NestedCall.asm | 74 +++- .../FunctionCalls/StaticsTest/StaticsTest.asm | 402 ++++++++++++++++-- 5 files changed, 464 insertions(+), 58 deletions(-) diff --git a/vmtranslator/code_writer.go b/vmtranslator/code_writer.go index 3238427..60910df 100644 --- a/vmtranslator/code_writer.go +++ b/vmtranslator/code_writer.go @@ -229,16 +229,16 @@ func (c *CodeWriter) WriteCall(functionName string, numArgs int) { buffer.WriteString("@THAT\n") buffer.WriteString("D=M\n") push(&buffer) - // ARG = SP - (n + 5) - buffer.WriteString("@" + strconv.Itoa(numArgs+5) + "\n") - buffer.WriteString("D=D-A\n") - buffer.WriteString("@ARG\n") - buffer.WriteString("M=D\n") // LCL = SP buffer.WriteString("@SP\n") buffer.WriteString("D=M\n") buffer.WriteString("@LCL\n") buffer.WriteString("M=D\n") + // ARG = SP - (n + 5) + buffer.WriteString("@" + strconv.Itoa(numArgs+5) + "\n") + buffer.WriteString("D=D-A\n") + buffer.WriteString("@ARG\n") + buffer.WriteString("M=D\n") // goto function buffer.WriteString("@" + functionName + "\n") buffer.WriteString("0;JMP\n") diff --git a/vmtranslator/main.go b/vmtranslator/main.go index 6e4a90c..5a2fd1a 100644 --- a/vmtranslator/main.go +++ b/vmtranslator/main.go @@ -58,7 +58,9 @@ func main() { return err } parse(in, codeWriter, path) - } else { + } + + if d.IsDir() { if codeWriter != nil { codeWriter.Close() } diff --git a/vmtranslator/testdata/FunctionCalls/FibonacciElement/FibonacciElement.asm b/vmtranslator/testdata/FunctionCalls/FibonacciElement/FibonacciElement.asm index 17498c2..e929f87 100644 --- a/vmtranslator/testdata/FunctionCalls/FibonacciElement/FibonacciElement.asm +++ b/vmtranslator/testdata/FunctionCalls/FibonacciElement/FibonacciElement.asm @@ -37,14 +37,14 @@ A=M M=D @SP M=M+1 -@5 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@5 +D=D-A +@ARG +M=D @Sys.init 0;JMP (_Sys.init_RETURN_0) @@ -201,14 +201,14 @@ A=M M=D @SP M=M+1 -@6 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@6 +D=D-A +@ARG +M=D @Main.fibonacci 0;JMP (_Main.fibonacci_RETURN_1) @@ -269,14 +269,14 @@ A=M M=D @SP M=M+1 -@6 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@6 +D=D-A +@ARG +M=D @Main.fibonacci 0;JMP (_Main.fibonacci_RETURN_2) @@ -370,14 +370,14 @@ A=M M=D @SP M=M+1 -@6 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@6 +D=D-A +@ARG +M=D @Main.fibonacci 0;JMP (_Main.fibonacci_RETURN_3) diff --git a/vmtranslator/testdata/FunctionCalls/NestedCall/NestedCall.asm b/vmtranslator/testdata/FunctionCalls/NestedCall/NestedCall.asm index fef5507..d18b9cc 100644 --- a/vmtranslator/testdata/FunctionCalls/NestedCall/NestedCall.asm +++ b/vmtranslator/testdata/FunctionCalls/NestedCall/NestedCall.asm @@ -1,3 +1,53 @@ +@256 +D=A +@SP +M=D +@_Sys.init_RETURN_0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@LCL +M=D +@5 +D=D-A +@ARG +M=D +@Sys.init +0;JMP +(_Sys.init_RETURN_0) (Sys.init) @4000 D=A @@ -33,7 +83,7 @@ D=M @R13 A=M M=D -@_Sys.main_RETURN_0 +@_Sys.main_RETURN_1 D=A @SP A=M @@ -68,17 +118,17 @@ A=M M=D @SP M=M+1 -@5 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@5 +D=D-A +@ARG +M=D @Sys.main 0;JMP -(_Sys.main_RETURN_0) +(_Sys.main_RETURN_1) @R6 D=A @R13 @@ -226,7 +276,7 @@ A=M M=D @SP M=M+1 -@_Sys.add12_RETURN_1 +@_Sys.add12_RETURN_2 D=A @SP A=M @@ -261,17 +311,17 @@ A=M M=D @SP M=M+1 -@6 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@6 +D=D-A +@ARG +M=D @Sys.add12 0;JMP -(_Sys.add12_RETURN_1) +(_Sys.add12_RETURN_2) @R5 D=A @R13 diff --git a/vmtranslator/testdata/FunctionCalls/StaticsTest/StaticsTest.asm b/vmtranslator/testdata/FunctionCalls/StaticsTest/StaticsTest.asm index cfd24cc..646223e 100644 --- a/vmtranslator/testdata/FunctionCalls/StaticsTest/StaticsTest.asm +++ b/vmtranslator/testdata/FunctionCalls/StaticsTest/StaticsTest.asm @@ -1,3 +1,357 @@ +@256 +D=A +@SP +M=D +@_Sys.init_RETURN_0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@LCL +M=D +@5 +D=D-A +@ARG +M=D +@Sys.init +0;JMP +(_Sys.init_RETURN_0) +(Class1.set) +@ARG +D=M +@0 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@Class1.0 +D=A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@1 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@Class1.1 +D=A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +AM=M-1 +D=M +@THAT +M=D +@R13 +AM=M-1 +D=M +@THIS +M=D +@R13 +AM=M-1 +D=M +@ARG +M=D +@R13 +AM=M-1 +D=M +@LCL +M=D +@R14 +A=M +0;JMP +(Class1.get) +@Class1.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@Class1.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +AM=M-1 +D=M +@THAT +M=D +@R13 +AM=M-1 +D=M +@THIS +M=D +@R13 +AM=M-1 +D=M +@ARG +M=D +@R13 +AM=M-1 +D=M +@LCL +M=D +@R14 +A=M +0;JMP +(Class2.set) +@ARG +D=M +@0 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@Class2.0 +D=A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@1 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@Class2.1 +D=A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +AM=M-1 +D=M +@THAT +M=D +@R13 +AM=M-1 +D=M +@THIS +M=D +@R13 +AM=M-1 +D=M +@ARG +M=D +@R13 +AM=M-1 +D=M +@LCL +M=D +@R14 +A=M +0;JMP +(Class2.get) +@Class2.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@Class2.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +AM=M-1 +D=M +@THAT +M=D +@R13 +AM=M-1 +D=M +@THIS +M=D +@R13 +AM=M-1 +D=M +@ARG +M=D +@R13 +AM=M-1 +D=M +@LCL +M=D +@R14 +A=M +0;JMP (Sys.init) @6 D=A @@ -13,7 +367,7 @@ A=M M=D @SP M=M+1 -@_Class1.set_RETURN_0 +@_Class1.set_RETURN_1 D=A @SP A=M @@ -48,17 +402,17 @@ A=M M=D @SP M=M+1 -@7 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@7 +D=D-A +@ARG +M=D @Class1.set 0;JMP -(_Class1.set_RETURN_0) +(_Class1.set_RETURN_1) @R5 D=A @R13 @@ -83,7 +437,7 @@ A=M M=D @SP M=M+1 -@_Class2.set_RETURN_1 +@_Class2.set_RETURN_2 D=A @SP A=M @@ -118,17 +472,17 @@ A=M M=D @SP M=M+1 -@7 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@7 +D=D-A +@ARG +M=D @Class2.set 0;JMP -(_Class2.set_RETURN_1) +(_Class2.set_RETURN_2) @R5 D=A @R13 @@ -139,7 +493,7 @@ D=M @R13 A=M M=D -@_Class1.get_RETURN_2 +@_Class1.get_RETURN_3 D=A @SP A=M @@ -174,18 +528,18 @@ A=M M=D @SP M=M+1 -@5 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@5 +D=D-A +@ARG +M=D @Class1.get 0;JMP -(_Class1.get_RETURN_2) -@_Class2.get_RETURN_3 +(_Class1.get_RETURN_3) +@_Class2.get_RETURN_4 D=A @SP A=M @@ -220,17 +574,17 @@ A=M M=D @SP M=M+1 -@5 -D=D-A -@ARG -M=D @SP D=M @LCL M=D +@5 +D=D-A +@ARG +M=D @Class2.get 0;JMP -(_Class2.get_RETURN_3) +(_Class2.get_RETURN_4) (Sys.init$END) @Sys.init$END 0;JMP