start 04b compiler
This commit is contained in:
parent
17cf6b6fa0
commit
9760d898b7
5 changed files with 584 additions and 96 deletions
96
04b/in04b
Normal file
96
04b/in04b
Normal file
|
@ -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]
|
Loading…
Add table
Add a link
Reference in a new issue