sBPF BooksBPF Book
Program Development

Instruction Set

Every sBPF instruction this book uses, with syntax, operand types, and alignment rules.

Compact reference. For teaching-style introductions to these instructions, see Assembly → Instructions.

Data movement

MnemonicSyntaxSemantics
mov64mov64 dst, srcdst = src (src is register or 32-bit imm)
lddwlddw rN, IMMrN = IMM (64-bit imm or label address; 16-byte instruction)
ldxbldxb rN, [base + off]read 1 byte (zero-extend)
ldxhldxh rN, [base + off]read 2 bytes (zero-extend)
ldxwldxw rN, [base + off]read 4 bytes (zero-extend)
ldxdwldxdw rN, [base + off]read 8 bytes
stxbstxb [base + off], srcwrite low 1 byte of src
stxhstxh [base + off], srcwrite low 2 bytes of src
stxwstxw [base + off], srcwrite low 4 bytes of src
stxdwstxdw [base + off], srcwrite 8 bytes of src

Memory addressing: [base + offset] where base is a register and offset is a signed 16-bit immediate (-32768 to +32767). Operation must be naturally aligned for its size.

Arithmetic (64-bit)

MnemonicSyntaxSemantics
add64add64 dst, srcdst = dst + src
sub64sub64 dst, srcdst = dst - src
mul64mul64 dst, srcdst = dst * src
div64div64 dst, srcdst = dst / src (unsigned)
sdiv64sdiv64 dst, srcdst = dst / src (signed)
mod64mod64 dst, srcdst = dst % src (unsigned)
and64and64 dst, srcbitwise AND
or64or64 dst, srcbitwise OR
xor64xor64 dst, srcbitwise XOR
lsh64lsh64 dst, srcdst <<= src (logical)
rsh64rsh64 dst, srcdst >>= src (logical)
arsh64arsh64 dst, srcdst >>= src (arithmetic, sign-extend)
neg64neg64 dstdst = -dst

src can be a register or a 32-bit immediate.

32-bit variants exist (drop the 64 suffix): operate on the low 32 bits and zero the upper 32. Almost never needed in Solana programs.

Control flow

MnemonicSyntaxJumps if
jeqjeq dst, src, labeldst == src
jnejne dst, src, labeldst != src
jgtjgt dst, src, labeldst > src (unsigned)
jgejge dst, src, labeldst >= src (unsigned)
jltjlt dst, src, labeldst < src (unsigned)
jlejle dst, src, labeldst <= src (unsigned)
jsgtjsgt dst, src, labeldst > src (signed)
jsgejsge dst, src, labeldst >= src (signed)
jsltjslt dst, src, labeldst < src (signed)
jslejsle dst, src, labeldst <= src (signed)
jsetjset dst, src, label(dst & src) != 0
jaja labelunconditional

dst is always a register. src is a register or 32-bit immediate. Falls through on false.

Syscall and exit

MnemonicSyntaxSemantics
callcall <name>invoke a runtime syscall; args in r1-r5, return in r0; clobbers r1-r5; preserves r6-r9
exitexitend program; runtime reads exit code from r0

Register conventions

RegisterRoleVolatility across call
r0exit code + syscall return valueclobbered
r1first syscall arg; on entry, input region pointerclobbered
r2second syscall argclobbered
r3third syscall argclobbered
r4fourth syscall argclobbered
r5fifth syscall argclobbered
r6general purposepreserved
r7general purposepreserved
r8general purposepreserved
r9general purposepreserved
r10read-only stack pointerpreserved

Encoding

Every instruction is exactly 8 bytes, with one exception:

  • lddw is 16 bytes (it carries a 64-bit immediate).

This means program size in bytes ≈ instruction_count × 8 + lddw_count × 8 extra.

Alignment rules

Operation sizeRequired address alignment
1 byteany
2 bytes2-byte aligned
4 bytes4-byte aligned
8 bytes8-byte aligned

Misaligned access traps the runtime and aborts the transaction.

On this page

Edit on GitHub