Word size is 9 trits (one tryte). Instructions begin executing from address 0.
Register name | 2-trit representation | Purpose |
---|---|---|
r0 | -- | |
r1 | -o | |
r2 | -+ | |
r3 | o- | |
r4 | oo | |
r5 | o+ | |
r6 | +- | |
ra | +o | Return address |
sp | ++ | Stack pointer |
The sp
register is the stack pointer. You should allocate a block of memory for
it at boot if you will be using it:
.main
MOV sp, $stack
; ...
$stack[30]
To push a register to the stack, store to sp
then increment it.
STA r0, sp
ADD sp, +
To pop a register from the stack, decrement sp
then load from it.
ADD sp, -
LDA r0, sp
The above patterns are so common that the assembler provides PSH and POP pseudoinstructions which expand to them:
PSH r0 ; push a single register
PSH r1, r2, r3 ; push multiple registers
; ...
POP r0, r1, r2, r3 ; pop registers; order should be same as PSH
If you decide to never use the stack, sp
is not treated in any special way by the CPU
and can be used as a general register like r0
-r6
.
x
represents the first operand, which is always a register.
y
represents the second operand, which may be an immediate or a register.
z
represents the third operand, which is an optional word. Where z
is used, y
must be a
register.
yz
represents the third operand in addressing mode 1, or the second in other addressing modes.
(See addressing modes)
Opcode | Syntax | Description |
---|---|---|
-40 | Reserved | |
-39 | ADD x, yz |
x = x + yz |
-38 | ADC x, yz |
x = x + yz + carry (intended for double-precision arithmetic) |
-37 | MUL x, yz |
x = x * yz |
-36 | DIV x, yz |
x = x / yz (remainder is discarded). |
-35 | MOD x, yz |
x = x % yz (x = remainder of x / yz) |
-34 | NEG x, yz |
Sets x to the tritwise NOT / arithmetic negation ofyz . |
-33 | MIN x, yz |
Tritwise AND (minimum). |
-32 | MAX x, yz |
Tritwise OR (maximum). |
-31 | XOR x, yz |
Tritwise XOR (exclusive or). |
-30 | CON x, yz |
Tritwise consensus. |
-29 | ANY x, yz |
Tritwise accept-anything. |
-28 | SHR x, yz |
Arithmetic shift x right yz times. Use negative yz to shift left. |
-27 | SHU x, yz |
Arithmetic shift x up yz times. Use negative yz to shift down. |
0 | MOV x, yz |
Copies yz into x . |
1 | LDA x, yz |
Loads the tryte at address yz into x . |
2 | STA x, yz |
Stores x at address yz . |
3 | LDO x, y, z |
Loads the tryte at address y + z into x . |
4 | STO x, y, z |
Stores x at address y + z . |
30 | JEQ x, y, z |
Jumps to address z if x == y . |
31 | JNE x, y, z |
Jumps to address z if x != y . |
32 | JGT x, y, z |
Jumps to address z if x > y . |
33 | JLT x, y, z |
Jumps to address z if x < y . |
34 | JGE x, y, z |
Jumps to address z if x >= y . |
35 | JLE x, y, z |
Jumps to address z if x <= y . |
36 | JMP yz |
Jumps to address yz . |
37 | JAL yz |
Jumps to address yz , setting ra to the following instruction. |
See also the assembler pseudoinstructions.
Instructions are encoded as follows:
OOOOAXXXX
| ||
| |+--- depends on addressing mode, see below
| |
| +---- addressing mode
|
+-------- opcode
Instructions using addressing modes -
and o
take up one tryte. Addressing mode +
requires an
auxillary word following it, so they take up 2T.
This is the 'register, register' addressing mode.
OOOO-RRTT
| | |
| | +- register 2
| |
| +--- register 1
|
+-------- opcode
This is the 'short immediate' addressing mode.
OOOOoRRII
| | |
| | +- 2t immediate value (-9 to 9)
| |
| +--- register
|
+-------- opcode
This is the 'word immediate' addressing mode.
OOOO+RRTT IIIIIIIII
| | | |
| | | +-------- 1T immediate value (-9841 to 9841)
| | |
| | +----------- register 2
| |
| +------------- register 1
|
+------------------ opcode