Skip to content

NowaVM ISA


[bytecode] [opcode] [syntax] [desc]

regX - dest

regY - source

imm - 64 bit integer

addr - absolute VM memory address

l - label


ISA

bytecode opcode syntax description
0x00 NOOP noop does nothing
0x01 LD ld reg imm loads imm into register
0x02 ADD add regX regY add value of regY to value of regX
0x03 SUB sub regX regY sub value of regY from value of regX
0x04 MUL mul regX regY mul value of regX by value of regY
0x05 DIV div regX regY div value of regX by value of regY
0x06 IMUL imul regX regY imul value of regX by value of regY
0x07 IDIV idiv regX regY idiv value of regX by value of regY
0x08 XOR_ xor regX regY xores value of regX with value of regY
0x09 AND_ and regX regY logic and between regX and regY
0x0A OR_ or regX regY logic or between regX and regY
0x0B SHL shl regX regY shifts left value of regX by value of regY
0x0C SHR shr regX regY shifts right value od regX by value of regY
0x0D JMP jmp l/addr jumps to label address or address
0x0E CMP cmp reg reg compares 2 registers
0x0F JZ jz l/addr jumps if zero flag set
0x10 JNZ jnz l/addr jumps if zero flag is not set
0x11 JC jc l/addr jumps if carry flag is set
0x12 JNC jnc l/addr jumps if carry flag is not set
0x13 STORE store reg addr stores value of register into memoryaddr
0x14 LDM ldm reg addr loads value 8 bit value from memory[addr] into register
0x15 JL jl l/addr jumps if less flag is set
0x16 JLE jle l/addr jumps if less and zero flags are set
0x17 JB jb l/addr jumps if bigger flag is set
0x18 JBE jbe l/addr jumps id bigger and zero flag is set
0x19 JMP_REGV jmprv reg (interpreter only) gets value from register and interpretes that as jump address
0x1A PUSH push reg pushes register value into virtual stack
0x1B POP pop reg pops virtual stack top into register
0x1C CALL call l calls funtion and pushes call address into callstack
0x1D RET ret returns to the address that stored at top of callstack
0x1E FADD fadd regX regY adds float value of regY to regX
0x1F FSUB fsub regX regY sub float value of regY from regX
0x20 FMUL fmul regX regY mul float value of regY by regX
0x21 FDIV fdiv regX regY div float value of regY by regX
0x22 COPY copy regY regX copies value of regY to regX
0x23 SWAP swap regX regY swaps values of regX and regY
0x24 FMA fma reg reg reg fusion-add-mul, e.g. r0=r0*r2+r1
0x25 LTF ltf reg converts 64 bit integer into double, e.g. 4->4.0
0x26 FTL ftl reg converts double into 64 bit integer, e.g. 4.0->4
0x27 NOT not reg inverts bits of register
0x28 ROR ror regX regY rotates right value of regX by value of regY
0x29 ROL rol regX regY rotates left value of regX by value of regY
0x2A ARX arx reg reg reg reg add-rotateleft-xor, e.g. r0=rotl(r0+r1, r2) xor r3
0x2B STORX storx regX regY stores value of regX into memory[regY*8]
0x2C LDMX ldmx regX regY loads value(8 bit) from memory[regY*8]
0x2D LDZERO ldzero reg loads 0 into register
0xFF HLT hlt ends execution of program