diff options
author | Suleyman Farajli <suleyman@farajli.net> | 2024-12-26 17:04:24 +0400 |
---|---|---|
committer | Suleyman Farajli <suleyman@farajli.net> | 2024-12-26 17:04:24 +0400 |
commit | 00e720bf0814ada8f4c36179d6d732862336cf97 (patch) | |
tree | 95be3e78c1c36490b57fc6b4efc52a23dec30bda /src | |
parent | 6a5db026b93b97879ec7a5d15c1f0047b13c6083 (diff) |
`while` implemented
Diffstat (limited to 'src')
-rw-r--r-- | src/main.go | 18 |
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") } |