Assembly tokenization should be working completely. It knows what instructions the CPU implementation supports and parses based on them.
- RV32I
- Loads/Stores:
lb, lh, lw, lbu, lhu, sw, sh, sb
(supported arg format is eitherrd, imm(reg)
orrd, reg, imm
) - Branch statements:
beq, bne, blt, bge, bltu, bgeu
- Jumps
j, jal, jalr, ret
- Basic arithmetic:
add, addi, sub, lui, auipc
- Shifts:
sll, slli, srl, srli, sra, srai
- Syscall/Debugging:
scall, ecall, sbreak, ebreak
(boths
ande
version are the same instruction) - Compares:
slt, sltu, slti, sltiu
- Logical:
and, or, xor, andi, ori, xori
- Not implemented:
fence, fence.i, rdcycle, rdcycleh, rdtime, rdtimeh, rdinstret, rdinstreth
- Loads/Stores:
- RV32M
- Multiplication:
mul, mulh
, not implemented yet aremulhsu, mulhu
- Division:
div, divu, rem, remu
- Multiplication:
The following pseudo-ops are implemented as of yet:
.space <len>
reverse bytes of zero.ascii 'text'
put text into memory.asciiz 'text'
put text into memory (null terminated).section .<name>
same as.<name>
, see sections.set <name>, <value>
to create a const symbol with a given value.global <name>
mark symbol<name>
as a global symbol. It is available from all loaded programs.align <bytes>
currently a nop as cpu does not care about alignment as of now
Currently only these three sections are supported:
data
read-write data (non-executable)rodata
read-only data (non-executable)text
executable data (read-only)