File: 01-Syntax.md

package info (click to toggle)
storm-lang 0.7.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,028 kB
  • sloc: ansic: 261,471; cpp: 140,432; sh: 14,891; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (81 lines) | stat: -rw-r--r-- 2,901 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
Syntax
=======

The syntax used in the inline assembler is inspired by the Intel assembly language. This means that
each statement has the form: `<op> <dest>, <src>;`. Some statements only take one operand.

Each of the two operands can be one of:
* A register
* A literal
* A variable
* A label
* Conditionals


Registers
----------

Three different registers are available: `a`, `b` and `c`. These come in four sizes, `al`, `bl` and
`cl` for byte-sized registers, `eax`, `ebx` and `ecx` for Int-sized registers, `rax`, `rbx`, `rcx`
for Long-sized registers and `ptrA`, `ptrB` and `ptrC` for pointer-sized registers. These are
referred to by their names.

Literals
---------

Literals are numeric constants with a prefix telling their type. Size prefixes are supported: `b`
for `Byte`, `i` for `Int`, `n` for `Nat`, `l` for `Long` , `w` for `Word` or `p` for
pointer-size.

The literal 'sPtr', optionally followed by an asterisk and an integer, can be used as a
pointer-sized literal representing multiples of the pointer-size of the current plaform (4 or 8
bytes).


Variables
----------

To refer to variables in Basic Storm, simply refer to them by name. A variable will return its
representation in Basic Storm. A variable holding an `Int` can be accessed as an `Int` in assembler
and modified. Variables of object-types are pointers.


Memory access
-------------

Memory is accessed using square braces preceeded by a size specifier. The braces may contain a
pointer-sized register, optionally followed by a `+` sign and an integer literal to indicate an
offset. The size specifier for the memory access is the same as for numeric literals described
above.

Example: `i[ptrA]` reads an integer (`i`) from the address in `ptrA`.

Example: `l[ptrA + 8]` reads a long (`l`) from the address 8 bytes after `ptrA`.

Example: `p[ptrA + sPtr]` reads a pointer (`p`) from `ptrA` plus the size of one pointer (4 or 8 bytes depending on the platform).

Example: `p[ptrA + sPtr*2]` reads a pointer (`p`) from `ptrA` plus the size of two pointers (4 or 8 bytes eac depending on the platform).


Labels
--------

Labels can be placed before or after any statement, and are formed by a name followed by a colon
(`:`). Labels are referred to as `@<name>`.


Conditionals
-------------

Some op-codes take a conditional as one of their parameters. A conditional represents the result of
the last `cmp` operation. These conditionals can be one of the following:
* `ifEqual` - a equals b
* `ifNotEqual` - a does not equal b
* `ifAbove` - a is above b (unsigned)
* `ifAboveEqual` - a is above or equal to b (unsigned)
* `ifBelow` - a is below b (unsigned)
* `ifBelowEqual` - a is below or equal to b (unsigned)
* `ifGreater` - a is greater than b (signed)
* `ifGreaterEqual` - a is greater than or equal to b (signed)
* `ifLess` - a is less than b (signed)
* `ifLessEqual` - a is less than or equal to b (signed)