Pravda assembler (pasm) is a text representation of Pravda VM bytecode.
Let's consider one simple program written in pasm:
/* My program */
jump @main
@ok:
push "good"
jump @end
@main:
push 2
mul
push 8
gt
jumpi @ok
push "bad"
@end:
It pops item from the stack and multiplies it by 2. If it is less than 8 it pushes "good" to the stack, else it pushes "bad".
pasm
operations are easy to understand. There're several things that differ from low-level bytecode:
- You can define labels:
@my_label:
. - Jump to defined labels
jump @my_label
. Jump with conditionjumi @my_label
and jump to functions with preserved call-stackcall @my_label
. - Push primitive to the stack:
push [primitive]
. Or put item to the heap:new [data]
(in this case reference to data will be pushed to the stack). - Write comments:
/* a comment */
. - Work with structs:
struct_mut [primitive]
,struct_get [primitive]
. This will produceSTRUCT_MUT_STATIC
andSTRUCT_GET_STATIC
opcodes which take key for struct field from bytecode. You can writestruct_mut
orstruct_get
without[primitive]
literal. In this caseSTRUCT_MUT
andSTRUCT_GET
opcodes are used and key is taken from stack. - Use regular orphan opcodes.
- Add meta information via
meta <meta>
, see<meta>
definition for details.
See also string data
encoding.