summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSuleyman Farajli <suleyman@farajli.net>2024-12-24 22:22:05 +0400
committerSuleyman Farajli <suleyman@farajli.net>2024-12-24 22:22:05 +0400
commit2216327f459cf34dbe65c23e1c488ac3474183a5 (patch)
treee02bbc1cd2fde1e6196c5e3c334fbbb3bbb4d56d /src
parentcc4246b5b9e19b53759ff3b24a55663d15015274 (diff)
`=` word added
Diffstat (limited to 'src')
-rw-r--r--src/main.go88
1 files changed, 51 insertions, 37 deletions
diff --git a/src/main.go b/src/main.go
index 03d16b5..7d2185a 100644
--- a/src/main.go
+++ b/src/main.go
@@ -31,7 +31,57 @@ func readfile(path string) []string {
}
func compile(raw[]string) {
- print("dump:");
+
+ print(" section .text")
+ print(" global _start")
+ print("_start:")
+
+ for i := 0; i < len(raw); i++ {
+ number, err := strconv.Atoi(raw[i]);
+ if err == nil {
+ print(" ;; PUSHING TO STACK")
+ print(" push", number);
+ continue;
+ }
+
+ switch raw[i] {
+ case "+":
+ print(" ;; PLUS")
+ print(" pop rsi")
+ print(" pop rax")
+ print(" add rax, rsi")
+ print(" push rax")
+ case "-":
+ print(" ;; MINUS")
+ print(" pop rsi")
+ print(" pop rax")
+ print(" sub rax, rsi")
+ print(" push rax")
+ case ".":
+ print(" ;; DUMP")
+ print(" pop rdi")
+ print(" call .dump")
+ case "=":
+ print(" ;; EQUAL")
+ print(" mov r10, 0")
+ print(" mov r11, 1")
+ print(" pop rsi")
+ print(" pop rax")
+ print(" cmp rsi, rax")
+ print(" cmove r10, r11")
+ print(" push r10")
+ default:
+ panic("invalid word")
+ }
+
+ }
+
+ print(" ;; RETURN")
+ print(" mov rdi, 0")
+ print(" mov rax, 60")
+ print(" syscall")
+
+ print(".dump:");
print(" push rbp");
print(" mov rbp, rsp");
print(" sub rsp, 48");
@@ -105,42 +155,6 @@ func compile(raw[]string) {
print(" nop");
print(" leave");
print(" ret")
-
- print(" section .text")
- print(" global _start")
- print("_start:")
-
- for i := 0; i < len(raw); i++ {
- number, err := strconv.Atoi(raw[i]);
- if err == nil {
- print(" ;; PUSHING TO STACK")
- print(" push", number);
- }
-
- switch raw[i] {
- case "+":
- print(" ;; PLUS")
- print(" pop, rsi")
- print(" pop, rax")
- print(" add rax, rsi")
- print(" push rax")
- case "-":
- print(" ;; MINUS")
- print(" pop, rsi")
- print(" pop, rax")
- print(" sub rax, rsi")
- print(" push rax")
- case ".":
- print(" ;; DUMP")
- print(" pop rdi")
- print(" call dump")
- }
- }
-
- print(" ;; RETURN")
- print(" mov rdi, 0")
- print(" mov rax, 60")
- print(" syscall")
}
func main() {