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)
