2021-11-19 09:52:27 -05:00
|
|
|
; 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>, ...)
|
2021-11-20 12:47:26 -05:00
|
|
|
; syscall <term>, <term>, ...
|
2021-11-19 09:52:27 -05:00
|
|
|
; 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>, ...)
|
2021-11-20 12:47:26 -05:00
|
|
|
; syscall <term>, <term>, ...
|
2021-11-19 09:52:27 -05:00
|
|
|
; <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
|
|
|
|
|
2021-11-19 23:27:08 -05:00
|
|
|
:strlen
|
|
|
|
function
|
|
|
|
argument *char s
|
2021-11-19 09:52:27 -05:00
|
|
|
local long len
|
|
|
|
local char c
|
|
|
|
len = 0
|
2021-11-19 23:27:08 -05:00
|
|
|
:strlen_loop
|
2021-11-19 09:52:27 -05:00
|
|
|
c = s[len]
|
2021-11-19 23:27:08 -05:00
|
|
|
if c == 0 goto strlen_loop_end
|
2021-11-19 09:52:27 -05:00
|
|
|
len += 1
|
2021-11-19 23:27:08 -05:00
|
|
|
goto strlen_loop
|
|
|
|
:strlen_loop_end
|
2021-11-19 09:52:27 -05:00
|
|
|
return len
|
|
|
|
|
2021-11-19 23:27:08 -05:00
|
|
|
:putc
|
|
|
|
function
|
|
|
|
argument char c
|
|
|
|
local *char p
|
2021-11-19 09:52:27 -05:00
|
|
|
p = &c
|
2021-11-20 12:47:26 -05:00
|
|
|
syscall 1, 1, p, 1, 0, 0, 0, 0
|
2021-11-19 09:52:27 -05:00
|
|
|
return
|
2021-11-20 11:38:34 -05:00
|
|
|
|
2021-11-19 23:27:08 -05:00
|
|
|
:puts
|
|
|
|
function
|
|
|
|
argument *char s
|
2021-11-19 09:52:27 -05:00
|
|
|
local long len
|
|
|
|
len = strlen(s)
|
2021-11-20 12:47:26 -05:00
|
|
|
syscall 1, 1, s, len, 0, 0, 0, 0
|
2021-11-19 09:52:27 -05:00
|
|
|
return
|
|
|
|
|
2021-11-19 23:27:08 -05:00
|
|
|
:main
|
|
|
|
function
|
2021-11-19 09:52:27 -05:00
|
|
|
local *char hello
|
|
|
|
hello = `Hello, world!
|
|
|
|
`
|
|
|
|
puts(hello)
|
2021-11-20 12:47:26 -05:00
|
|
|
syscall 0x3c, 0, 0, 0, 0, 0, 0, 0
|
2021-11-19 09:52:27 -05:00
|
|
|
|
2021-11-19 23:27:08 -05:00
|
|
|
|
|
|
|
:f
|
|
|
|
function
|
|
|
|
argument *long x
|
|
|
|
argument *long y
|
2021-11-19 09:52:27 -05:00
|
|
|
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]
|