https://github.com/akkartik/mu/blob/main/shell/int-stack.mu
1 type int-stack {
2 data: (handle array int)
3 top: int
4 }
5
6 fn initialize-int-stack _self: (addr int-stack), n: int {
7 var self/esi: (addr int-stack) <- copy _self
8 var d/edi: (addr handle array int) <- get self, data
9 populate d, n
10 var top/eax: (addr int) <- get self, top
11 copy-to *top, 0
12 }
13
14 fn push-int-stack _self: (addr int-stack), _val: int {
15 var self/esi: (addr int-stack) <- copy _self
16 var top-addr/ecx: (addr int) <- get self, top
17 var data-ah/edx: (addr handle array int) <- get self, data
18 var data/eax: (addr array int) <- lookup *data-ah
19 var top/edx: int <- copy *top-addr
20 var dest-addr/edx: (addr int) <- index data, top
21 var val/eax: int <- copy _val
22 copy-to *dest-addr, val
23 add-to *top-addr, 1
24 }
25
26 fn pop-int-stack _self: (addr int-stack) -> _/eax: int {
27 var self/esi: (addr int-stack) <- copy _self
28 var top-addr/ecx: (addr int) <- get self, top
29 {
30 compare *top-addr, 0
31 break-if->
32 return 0
33 }
34 subtract-from *top-addr, 1
35 var data-ah/edx: (addr handle array int) <- get self, data
36 var data/eax: (addr array int) <- lookup *data-ah
37 var top/edx: int <- copy *top-addr
38 var result-addr/eax: (addr int) <- index data, top
39 var val/eax: int <- copy *result-addr
40 return val
41 }
42
43 fn int-stack-empty? _self: (addr int-stack) -> _/eax: boolean {
44 var self/esi: (addr int-stack) <- copy _self
45 var top-addr/ecx: (addr int) <- get self, top
46 compare *top-addr, 0
47 {
48 break-if-=
49 return 0/false
50 }
51 return 1/true
52 }
53
54 fn int-stack-top _self: (addr int-stack) -> _/eax: int {
55 var self/esi: (addr int-stack) <- copy _self
56 var top-addr/ecx: (addr int) <- get self, top
57 var top/ecx: int <- copy *top-addr
58 {
59 compare top, 0
60 break-if->
61 return 0
62 }
63 top <- decrement
64 var data-ah/edx: (addr handle array int) <- get self, data
65 var data/eax: (addr array int) <- lookup *data-ah
66 var result-addr/eax: (addr int) <- index data, top
67 var val/eax: int <- copy *result-addr
68 return val
69 }