s-code


; no argument

1 add   next + top
2 sub   next - top
3 mul   ...  
4 div
5 and
6 or
7 xor
8 not   ! top
9 eq    next == top
10 ne   ...
11 lt
12 le
13 ge
14 gt
15 shl  next << top
16 shr  next >> top
17 mod  next % top

18 ldx  M[next+top]
19 stx  M[bot+next] = top

22 array alloc(top)
23 end   stop execution

; one argument

24 get x   SS[fp-x]
25 put x   SS[fp-x] = top
26 ld x    M[x]
27 st x    M[x] = top

28 jmp x   pc += x
29 jt x    if top != FALSE pc += x
30 jf x    if top == FALSE pc += x
31 lit x   x
32 call x  create new context pc = x

34 inc x   SS[fp-x]++
35 dec x   SS[fp-x]--
36 sys x   system function x

38 fun x   function header
40 ret x   delete context

code segment

one word  =   arg:24 op:8

arg 24-bit sign extended
op 1..40

stack segment

M[]

hi

top  <- stack pointer (sp)
next
bot
...

lo

context

hi

...   current stack

ret ads
fp'   <- frame pointer (fp)
lv1   <- SS[fp-1]
lv2
...

lo

action of call


  v = get (frame size - arity)
  SS[fp+v] = fp       save old fp
  fp = sp + v         new fp
  sp = fp + 1         new stack
  SS[sp] = pc + 1     save return ads
  pc = x + 1          goto fun body

action of ret


  pc = SS[fp+1]    restore pc
  if( sp > fp+1 )  there is a value to return
    a = top
    sp = fp - x + 1    old stack
    fp = SS[fp]        old fp
    SS[sp] = a         return value
  else
    sp = fp - x + 1    old stack
    fp = SS[fp]

system call


1  print top as int
2  print top as char
3  getchar()

object code file format


(op arg)*  0

example of program in s-code


fac n
  if n == 0 ret 1
  else return n * fac(n-1)
 
1 call 17
2 end
3 fun 1
4 get 1
5 lit 0
6 eq
7 jf 3
8 lit 1
9 ret 2
10 get 1
11 get 1
12 lit 1
13 sub
14 call 3
15 mul
16 ret 2
17 fun 0
18 lit 6
19 call 3
20 sys 1
21 ret 1

s-object


32 17
23 0
38 1
24 1
31 0
9 0
30 3
31 1
40 2
24 1
24 1
31 1
2 0
32 3
3 0
40 2
38 0
31 6
32 3
36 1
40 1
0