diff options
Diffstat (limited to '04b/in04b')
-rw-r--r-- | 04b/in04b | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/04b/in04b b/04b/in04b new file mode 100644 index 0000000..f312b54 --- /dev/null +++ b/04b/in04b @@ -0,0 +1,96 @@ +; types: char, short, int, long, *type +; declaration: +; global <type> <name> +; local <type> <name> +; :<label> +; statement: +; <declaration> +; if <term> <==/</>/>=/<=/!=> <term> goto <label> NOTE: this uses signed comparisons +; goto <label> +; <lvalue> = <rvalue> +; <lvalue> += <rvalue> +; <lvalue> -= <rvalue> +; <function>(<term>, <term>, ...) +; syscall(<term>, <term>, ...) +; return <rvalue> +; byte <number> +; term: +; <var> +; <number> +; number: +; 'c +; 12345 +; 0xabc +; lvalue: +; <var> +; *<var> +; <var>[<term>] +; rvalue: +; `<string>` +; <var> +; &<var> +; *<var> +; <var>[<term>] +; ~<var> +; <function>(<term>, <term>, ...) +; syscall(<term>, <term>, ...) +; <term> + <term> +; <term> - <term> +; NOTE: *, /, % are signed (imul and idiv) +; <term> * <term> +; <term> / <term> +; <term> % <term> +; <term> & <term> +; <term> | <term> +; <term> ^ <term> +; <term> < <term> (left shift) +; <term> > <term> (unsigned right shift) + +main() ; hello + +global char x +global short y ;123 +global long z + +function strlen(*char s) + local long len + local char c + len = 0 + :strlen.loop + c = s[len] + if c == 0 goto strlen.loop_end + len += 1 + goto strlen.loop + :strlen.loop_end + return len + +function putc(char c) + local char *p + p = &c + syscall(1, 1, p, 1, 0, 0, 0, 0) + return + +function puts(*char s) + local long len + len = strlen(s) + syscall(1, 1, s, len, 0, 0, 0, 0) + return + +function main() + local *char hello + hello = `Hello, world! +` + puts(hello) + syscall(0x3c, 0, 0, 0, 0, 0, 0, 0) + +function f(*long x, *long y) + local long v + local *long p + v = *x + p = *y + *p = v + if v == 0 goto something + p[1] = v + 1 + return p[2] + :something + return p[1] |