summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSuleyman Farajli <suleyman@farajli.net>2024-12-26 17:04:24 +0400
committerSuleyman Farajli <suleyman@farajli.net>2024-12-26 17:04:24 +0400
commit00e720bf0814ada8f4c36179d6d732862336cf97 (patch)
tree95be3e78c1c36490b57fc6b4efc52a23dec30bda /src
parent6a5db026b93b97879ec7a5d15c1f0047b13c6083 (diff)
`while` implemented
Diffstat (limited to 'src')
-rw-r--r--src/main.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/main.go b/src/main.go
index fe73108..eac5fa5 100644
--- a/src/main.go
+++ b/src/main.go
@@ -32,6 +32,7 @@ func readfile(path string) []string {
func compile(raw[]string) {
var iflabels[] int;
+ var looplabels[] int;
print("section .text")
print("global _start")
print("_start:")
@@ -89,6 +90,23 @@ func compile(raw[]string) {
fmt.Printf(".if%d:\n", iflabels[len(iflabels) - 1])
iflabels = iflabels[:len(iflabels) - 1]
+ case "while":
+ print(" ;; WHILE")
+ fmt.Printf(".loop%d:\n", i);
+ looplabels = append(looplabels, i)
+
+ case "do":
+ print(" ;; DO")
+ print(" pop r10")
+ print(" cmp r10, 0")
+ fmt.Printf(" je .endloop%d\n", looplabels[len(looplabels) - 1])
+
+ case "endloop":
+ print(" ;; ENDLOOP")
+ fmt.Printf(" jmp .loop%d\n", looplabels[len(looplabels) - 1])
+ fmt.Printf(".endloop%d:\n", looplabels[len(looplabels) - 1])
+ looplabels = looplabels[:len(looplabels) - 1]
+
default:
panic("invalid word")
}