Lasm
LASM
What is LASM?
LASM (Lua Assembly), is a low-level programming language created by User: Alx was designed to be used for a Lua/Python compiler, for an abandoned and unnamed project which compiled Lua to LASM (and assembled into LASM bytecode).
LASM VM
The LASM VM is a register machine, which also utilizes a stack incase register operations are not safe, otherwise register operations are preferred. The LASM VM has 3 registers, being A, B and C.
LASM Instruction Specifications
LASM Instruction Format
The LASM instruction size is a fixed 4 bytes / 32 bits long, with the exception of two instructions, which both have unsigned longs as as operand.
The LASM instruction layout specification is as follows:
Instruction Type A
First Bit (0) Opmode: 8 bits Operand A: 8 Bits Operand B: 8 bits Opcode: 8 bits Last Bit (32)
Instruction Type B
First Bit (0)
Opmode: 8 bits
Operand A: 8 Bits
Operand B: 8 bits
Opcode: 8 bits
Extened Operand: 32 bits
Last Bit (64)
The opmode specification specifies if the operands are immediate values, or register values. The opmode pairing specification is as follows:
| OPMODE A SPEC | OPMODE B SPEC | VALUE (base16) |
|---|---|---|
| REGISTER | REGISTER | 0x11 |
| REGISTER | IMMEDIATE | 0x10 |
| IMMEDIATE | REGISTER | 0x01 |
| IMMEDIATE | IMMEDIATE | 0x00 |
LASM Instruction Set
The following table contains the entire LASM instruction set.
Legend: ... -> N/A
| Opcode | Operand A | Operand B | Opmode | Description |
|---|---|---|---|---|
| ADD_R | uint8_t | uint8_t | ... | Add two registers, store result in first register. |
| ADD_S | ... | ... | ... | Pop two items off the stack, perform addition and push back to stack. |
| AND_S | ... | ... | ... | Pop two items off the stack, perform a logical AND, push back to stack. |
| BOR_S | ... | ... | ... | Pop two items off the stack, perform a logical OR and push back to stack. |
| CMP | uint8_t | ... | ... | Pop two items off the stack, perform one of the following: (==, ~=, <=, >=, <, >) and push result to stack. |
| CMP_R | uint8_t | uint8_t | ... | Obselete opcode. |
| FASTCALL | uint8_t | ... | ... | The first calling convention, which will use registers as the arguments for the function call. (Max argc: 3) |
| IMPORT | uint8_t | ... | ... | Obselete opcode. |
| JMP_ULONG | uint8_t | uint32_t | ... | Absolute long jump. |
| JMP_ULONG_FALSE | uint8_t | uint32_t | ... | Conditional long jump. |
| MMUL_R | uint8_t | uint8_t | ... | Obselete opcode. |
| MMUL_S | ... | ... | ... | Obselete opcode. |
| MOD_R | uint8_t | uint8_t | ... | Perform modulo on two registers, store result in first register. |
| MOD_S | ... | ... | ... | Pop two items off the stack, perform modulo and push back to stack. |
| MOV | uint8_t | uint8_t | ... | Move either a register into a register, or an immediate value into a register. |
| MOVG_A | uint8_t | ... | ... | Move a global (first operand pointing to the global name in the constants pool) into register A. |
| MOVG_B | uint8_t | ... | ... | Move a global (first operand pointing to the global name in the constants pool) into register B. |
| MOVG_C | uint8_t | ... | ... | Move a global (first operand pointing to the global name in the constants pool) into register C. |
| MOVK_A | uint8_t | ... | ... | Move a constant value (first operand pointing to the constant in the constant pool) into register A. |
| MOVK_B | uint8_t | ... | ... | Move a constant value (first operand pointing to the constant in the constant pool) into register B. |
| MOVK_C | uint8_t | ... | ... | Move a constant value (first operand pointing to the constant in the constant pool) into register C. |
| MUL_R | uint8_t | uint8_t | ... | Perform multiplication on two registers, store result in first register. |
| MUL_S | ... | ... | ... | Pop two items off the stack, perform multiplication and push back to stack. |
| POP | uint8_t | ... | ... | Pop the topmost stack item into a register. |
| POW_R | uint8_t | uint8_t | ... | Perform exponentiation on two registers, store result in first register. |
| POW_S | ... | ... | ... | Pop two items off the stack, perform exponentiation and push back to stack. |
| PUSH_G | uint8_t | ... | ... | Push a global to the stack. |
| PUSH_K | uint8_t | ... | ... | Push a constant to the stack. |
| PUSH_R | uint8_t | ... | ... | Push register contents to the stack. |
| STDCALL | uint8_t | ... | ... | The second calling convention, where the arguments are on the stack, rather than registers. |
| SUB_R | uint8_t | uint8_t | ... | Perform subtraction on two registers, store result in first register. |
| SUB_S | ... | ... | ... | Pop two items off the stack, perform subtraction and push back to stack. |
| XOR_S | ... | ... | ... | Pop two items off the stack, perform a bitwise XOR and push back to stack. |
| NOT | ... | ... | ... | Performs a logical NOT on the topmost stack item. |
| RET | ... | ... | ... | Jump to offset stored in register C. Used for non-nested custom function calls. |
| STORE_R | uint8_t | uint8_t | ... | Store register contents in a global pointed to by operand A. |
| STORE_S | uint8_t | ... | ... | Pop an item off the stack, and store it in a global pointed to by operand A. |
| JMP_INC | uint8_t | ... | ... | Incremental short absolute jump. |
| JMP_INC_FALSE | uint8_t | ... | ... | Incremental short conditional jump. |
| DISCARD | ... | ... | ... | Pop the topmost stack item off the stack. |
| JMP_UCHAR | uint8_t | ... | ... | Stores current offset in register C, and short absolute jumps to offset in operand A. |
| GETATTR_R | uint8_t | uint8_t | ... | Obselete opcode. |
| JMP_DEC | uint8_t | ... | ... | Decremental absolute jump. |
| JMP_UCHAR_T | uint8_t | ... | ... | Short absolute jumps to offset in operand A. Does not store previous offset. |
| PUSH_LL | uint8_t | ... | ... | Obselete opcode. |
| MOVLL_A | uint8_t | ... | ... | Obselete opcode. |
| MOVLL_B | uint8_t | ... | ... | Obselete opcode. |
| MOVLL_C | uint8_t | ... | ... | Obselete opcode. |
LASM Language Rules
LASM follows the simple language layout.
(opcode) [operand], [operand] [$opmode]
LASM Example programs
1. Hello World
; constant indexes in constants pool #const __PyGbl_print = 0 #const __Py_hello_world = 1 jmp_uchar main main: push_g __PyGbl_print $KK movk_a __Py_hello_world $KK fastcall 1 $KK
Extra
I may expand this.