diff options
Diffstat (limited to '04b')
-rw-r--r-- | 04b/in03 | 15 | ||||
-rw-r--r-- | 04b/in04b | 57 |
2 files changed, 34 insertions, 38 deletions
@@ -243,7 +243,6 @@ align reserve d8 :handle_global - xcc ; ignore if this is the second pass C=:second_pass C=1C @@ -262,6 +261,7 @@ align 8C=I J=:global_variables D=d5 + call :ident_lookup C=A ?C!0:global_redeclaration @@ -458,17 +458,15 @@ align ; look up identifier rsi in list rdi with separation rdx between entries ; returns address of whatever's right after the identifier in the list, or 0 if not found :ident_lookup - C=:second_pass - C=1C - ; use default of 1 on first pass - ?C=0:return_1 - C=:ident_lookup_sep 8C=D C=:ident_lookup_i 8C=I :ident_lookup_loop + ; check if reached the end of the table + C=1J + ?C=0:return_0 I=:ident_lookup_i I=8I call :ident= @@ -485,9 +483,6 @@ align C=:ident_lookup_sep C=8C J+=C - ; check if reached the end of the table - C=1J - ?C=0:return_0 !:ident_lookup_loop ; can the character in rbx appear in an identifier? @@ -525,8 +520,8 @@ align ; variable J=:local_variables - D=d5 xcc + D=d5 call :ident_lookup C=A ?C=0:rax2term_try_global @@ -1,4 +1,3 @@ -; types: char, short, int, long, *type ; declaration: ; global <type> <name> ; local <type> <name> @@ -11,7 +10,7 @@ ; <lvalue> += <rvalue> ; <lvalue> -= <rvalue> ; <function>(<term>, <term>, ...) -; syscall <term>, <term>, ... +; syscall <term> <term> ... ; return <rvalue> ; byte <number> ; term: @@ -29,7 +28,7 @@ ; `<string>` ; <var> ; &<var> -; *<var> +; *1 <var> / *2 <var> / *4 <var> / *8 <var> ; <var>[<term>] ; ~<var> ; <function>(<term>, <term>, ...) @@ -48,18 +47,20 @@ main() ; hello -global char x -global short y ;123 -global long z +global x +global y ;123 +global z :strlen function - argument *char s - local long len - local char c + argument s + local len + local c + local p len = 0 :strlen_loop - c = s[len] + p = s + len + c = *1 p if c == 0 goto strlen_loop_end len += 1 goto strlen_loop @@ -68,40 +69,40 @@ function :putc function - argument char c - local *char p + argument c + local p p = &c - syscall 1, 1, p, 1, 0, 0, 0, 0 + syscall 1 1 p 1 0 0 0 0 return :puts function - argument *char s - local long len + argument s + local len len = strlen(s) - syscall 1, 1, s, len, 0, 0, 0, 0 + syscall 1 1 s len 0 0 0 0 return :main function - local *char hello + local hello hello = `Hello, world! ` puts(hello) - syscall 0x3c, 0, 0, 0, 0, 0, 0, 0 + syscall 0x3c 0 0 0 0 0 0 0 :f function - argument *long x - argument *long y - local long v - local *long p - v = *x - p = *y - *p = v + argument x + argument y + local v + local p + v = *4x + p = *8y + *4p = v if v == 0 goto something - p[1] = v + 1 - return p[2] + *1p = v + 1 + return *2p :something - return p[1] + return *4p |