# LASM - Lucia Assembly Language Documentation
This is the documentation for LASM language.
## Registers
- **General Purpose**: `r0` - `r15` (64-bit)
- **Stack Pointer**: `rsp`
- **Base Pointer**: `rbp`
---
## Instructions
### Data Movement
- `mov <src>, <dst>` — Move value from source to destination
- `ldr <reg>, [<reg>]` — Load from memory address in register
- `str <reg>, [<reg>]` — Store to memory address in register
- `load "var", <reg>` — Load Rust variable into register
- `push <reg>, "var"` — Store register value to Rust variable
### Arithmetic
- `add <dst>, <src>` — Add
- `sub <dst>, <src>` — Subtract
- `mul <dst>, <src>` — Multiply
- `div <dst>, <src>` — Divide
- `mod <dst>, <src>` — Modulo
### Floating Point Arithmetic
- `fadd <dst>, <src>` — Add floats
- `fsub <dst>, <src>` — Subtract floats
- `fmul <dst>, <src>` — Multiply floats
- `fdiv <dst>, <src>` — Divide floats
- `fmod <dst>, <src>` — Modulo floats
### Logic
- `and <dst>, <src>` — Bitwise AND
- `or <dst>, <src>` — Bitwise OR
- `xor <dst>, <src>` — Bitwise XOR
- `not <dst>` — Bitwise NOT
- `shl <dst>, <src>` — Shift left
- `shr <dst>, <src>` — Shift right
### Control Flow
- `cmp <left>, <right>` — Compare values
- `beq <label>` — Branch if equal
- `bne <label>` — Branch if not equal
- `blt <label>` — Branch if less than
- `bgt <label>` — Branch if greater than
- `ble <label>` — Branch if less or equal
- `bge <label>` — Branch if greater or equal
- `jmp <label>` — Unconditional jump
- `call <label>` — Call subroutine
- `ret` — Return from subroutine
### Stack Operations
- `pushr <reg>` — Push register onto stack
- `popr <reg>` — Pop from stack into register
---
## Operands
- **Immediate values**: Numbers (e.g., `42`) or strings (e.g., `"hello"`)
- **Registers**: `r0` - `r15`
- **Labels**: For jumps and calls
---
## Syscalls
### I/O
- `syscall write` — Write to fd (`r0` = fd, `r1` = buffer, `r2` = count)
- `syscall read` — Read from fd
- `syscall print_int` — Print integer (`r0`)
- `syscall print_float` — Print float (`r0` as bits)
- `syscall print_str` — Print null-terminated string (`r0`)
- `syscall flush` — Flush output (`r0` = fd)
### Memory
- `syscall malloc` — Allocate memory (`r0` = size, returns ptr in `r0`)
- `syscall free` — Free memory (`r0` = ptr)
- `syscall memcpy` — Copy memory (`r0` = dst, `r1` = src, `r2` = len)
- `syscall memset` — Set memory (`r0` = dst, `r1` = val, `r2` = len)
### Strings
- `syscall strcmp` — Compare strings (`r0` = str1, `r1` = str2)
- `syscall strcpy` — Copy string (`r0` = dst, `r1` = src)
- `syscall strlen` — Get string length (`r0` = str)
- `syscall starts_with` — Check prefix (`r0` = str, `r1` = prefix)
- `syscall streq` — Check equality (`r0` = str1, `r1` = str2)
- `syscall ends_with` — Check suffix (`r0` = str, `r1` = suffix)
- `syscall trim` / `trim_start` / `trim_end` — Trim whitespace
- `syscall isws` — Check if string is all whitespace
### Conversion
- `syscall atoi` — String → integer
- `syscall atof` — String → float
- `syscall itoa` — Integer → string
- `syscall ftoa` — Float → string
- `syscall itof` — Integer → float
- `syscall ftoi` — Float → integer
### Time & Random
- `syscall time` — Current time (ns, returns in `r0`)
- `syscall fmt_time` — Format time (`r0` = total_nanos, `r1` = format, `r2` = buffer)
- `syscall rand` — Generate random float (`r0` = seed)
### Utilities
- `syscall sleep` — Sleep (`r0` = ms)
- `syscall system` — Execute command (`r0` = command string)
### System
- `syscall exit` — Exit program (`r0` = status)
---
## Syntax Details
- **Comments**: Start with `;`
- **Labels**: End with `:`
- **Strings**: Double quotes, null-terminated automatically
- **Numbers**: Decimal integers, can be used as immediates
- **Case Sensitive**: Keywords and registers
---
## Examples
### Hello World
```asm
mov "Hello, World!\n", r1
mov 1, r0
mov 14, r2
syscall write
mov 0, r0
syscall exit
````
### Calculator
```asm
mov 10, r0
mov 20, r1
add r0, r1
syscall print_int
mov "\n", r1
mov 1, r0
mov 1, r2
syscall write
mov 0, r0
syscall exit
```