# 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
```