summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSuleyman Farajli <suleyman@farajli.net>2024-12-24 19:11:46 +0400
committerSuleyman Farajli <suleyman@farajli.net>2024-12-24 19:11:46 +0400
commit08e4e0848ae9ac2e5c59062557e7514aaf822962 (patch)
tree2e90aa3e17f59a2d80cc2d1fe91f116d12ab6204 /src
parentd684b0ee2f142bdde5539cb0899949d4358cb115 (diff)
Plus minus and dump operations added
Diffstat (limited to 'src')
-rw-r--r--src/main.go116
1 files changed, 110 insertions, 6 deletions
diff --git a/src/main.go b/src/main.go
index 1773c2a..03d16b5 100644
--- a/src/main.go
+++ b/src/main.go
@@ -3,6 +3,7 @@ package main
import (
"fmt"
"regexp"
+ "strconv"
"os"
)
@@ -18,7 +19,6 @@ func readfile(path string) []string {
panic("failed to read file");
}
- /* FIXME: Find a better solution */
tmp := reg.Split(string(dat), -1);
for i := range tmp{
@@ -31,12 +31,116 @@ func readfile(path string) []string {
}
func compile(raw[]string) {
- print("section .text")
- print("global _start")
+ print("dump:");
+ print(" push rbp");
+ print(" mov rbp, rsp");
+ print(" sub rsp, 48");
+ print(" mov DWORD [rbp-36], edi");
+ print(" mov QWORD [rbp-32], 0");
+ print(" mov QWORD [rbp-24], 0");
+ print(" mov DWORD [rbp-16], 0");
+ print(" mov BYTE [rbp-13], 10");
+ print(" mov DWORD [rbp-4], 18");
+ print(" mov DWORD [rbp-8], 0");
+ print(" cmp DWORD [rbp-36], 0");
+ print(" jns .L3");
+ print(" neg DWORD [rbp-36]");
+ print(" mov DWORD [rbp-8], 1");
+ print(" .L3:");
+ print(" mov edx, DWORD [rbp-36]");
+ print(" movsx rax, edx");
+ print(" imul rax, rax, 1717986919");
+ print(" shr rax, 32");
+ print(" mov ecx, eax");
+ print(" sar ecx, 2");
+ print(" mov eax, edx");
+ print(" sar eax, 31");
+ print(" sub ecx, eax");
+ print(" mov eax, ecx");
+ print(" sal eax, 2");
+ print(" add eax, ecx");
+ print(" add eax, eax");
+ print(" sub edx, eax");
+ print(" mov DWORD [rbp-12], edx");
+ print(" mov eax, DWORD [rbp-12]");
+ print(" add eax, 48");
+ print(" mov edx, eax");
+ print(" mov eax, DWORD [rbp-4]");
+ print(" cdqe");
+ print(" mov BYTE [rbp-32+rax], dl");
+ print(" mov eax, DWORD [rbp-12]");
+ print(" sub DWORD [rbp-36], eax");
+ print(" mov eax, DWORD [rbp-36]");
+ print(" movsx rdx, eax");
+ print(" imul rdx, rdx, 1717986919");
+ print(" shr rdx, 32");
+ print(" mov ecx, edx");
+ print(" sar ecx, 2");
+ print(" cdq");
+ print(" mov eax, ecx");
+ print(" sub eax, edx");
+ print(" mov DWORD [rbp-36], eax");
+ print(" sub DWORD [rbp-4], 1");
+ print(" cmp DWORD [rbp-36], 0");
+ print(" jne .L3");
+ print(" cmp DWORD [rbp-8], 0");
+ print(" je .L4");
+ print(" mov eax, DWORD [rbp-4]");
+ print(" cdqe");
+ print(" mov BYTE [rbp-32+rax], 45");
+ print(" sub DWORD [rbp-4], 1");
+ print(" .L4:");
+ print(" mov eax, 20");
+ print(" sub eax, DWORD [rbp-4]");
+ print(" cdqe");
+ print(" mov edx, DWORD [rbp-4]");
+ print(" movsx rdx, edx");
+ print(" lea rcx, [rbp-32]");
+ print(" add rcx, rdx");
+ print(" mov rdx, rax");
+ print(" mov rsi, rcx");
+ print(" mov edi, 1");
+ print(" mov rax, 1");
+ print(" syscall");
+ print(" nop");
+ print(" leave");
+ print(" ret")
+
+ print(" section .text")
+ print(" global _start")
print("_start:")
- print("mov rdi, 0")
- print("mov rax, 60")
- print("syscall")
+
+ 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() {