CarpVM 是一个用 C 语言编写的小型虚拟机。可以嵌入在应用程序中使用。
包含的指令集有:
HALT (code): Halts and attempts to clean up stack, data memory, and label memory before exiting with given exit code.
NOP (): Does nothing. Seriously.
LOAD (reg, val): Loads given integer value into given register.
MOV (dst, src): Copies contents of src register into dst register.
ADD (): Pops the top two integers from the stack and pushes their sum.
SUB (): Pops the top two integers from the stack and pushes the difference (lower minus upper).
MUL (): Pops the top two integers from the stack and pushes their product.
MOD (rega, regb): Computes rega % regb and stores in ERX.
NOT (reg): Computes bitwise NOT of reg and stores in reg.
XOR (): Pops the top two integers from the stack and XORs them.
OR (): Pops the top two integers from the stack and ORs them.
AND (): Pops the top two integers from the stack and ANDs them.
INCR (reg): Increments value in given register.
DECR (reg): Decrements value in given register.
INC (): Increments the value at the top of the stack.
DEC (): Decrements the value at the top of the stack.
PUSHR (reg): Pushes value in given register.
PUSH (val): Pushes given value.
POP (val): Pops an integer from the stack and dumps it into GBG.
CMP (): Pops the top two integers from the stack and checks if equal. 0 means equal. Result will be pushed onto the stack.
MOV (rega, regb): Move value in rega to regb.
JZ (addr): Jumps to given absolute address if top of the stack is 0.
RJZ (diff): Adds differential to current EIP (relative jump) if top of the stack is 0.
JNZ (addr): Jumps to given absolute address if top of the stack is not 0.
RJNZ (diff): Adds differential to current EIP (relative jump) if top of the stack is not 0.
JMP (addr): Jumps to given absolute address.
RJMP (diff): Adds differential to current EIP (relative jump).
DBS (key, val): Sets data memory at key (string pointer) to given value.
DBG (key, reg): Gets value from data memory at key (string pointer) and dumps it into given register.
CALL (key, nargs): Save state and set EIP to value in data memory at key.
RET (val): Push return value and load state.
PREG (reg): Prints contents of given register.
PTOP (): Peeks top of stack and prints top value.