# Assembly Assembly tokenization should be working completely. It knows what instructions the CPU implementation supports and parses based on them. ## Instructions * all loads/stores: `lb, lh, lw, lbu, lhu, sw, sh, sb` * supported arg format is either `rd, imm(reg)` or `rd, reg, imm` * all branch statements: `beq, bne, blt, bge, bltu, bgeu` * all jumps `j, jal, jalr, ret` * basic arithmetic: `add, addi, sub` (not `lui, auipc`) * shifts: `sll, slli, srl, srli, sra, srai` * `scall, ecall, sbreak, ebreak` (both `s` and `e` version are the same instruction) * compares (non immediate): `slt, sltu` (not `slti, sltiu`) * logical (non immediate): `and, or, xor` (not `andi, ori, xori`) All unimplemented instructions can be added quite easily ## Pseudo-ops The following pseudo-ops are implemented as of yet: * `.space ` reverse bytes of zero * `.ascii 'text'` put text into memory * `.asciiz 'text'` put text into memory (null terminated) * `.section .` same as `.`, see sections * `.set , ` to create a const symbol with a given value * `.global ` mark symbol `` as a global symbol. It is available from all loaded programs ## Sections: Currently only these three sections are supported: * `data` read-write data (non-executable) * `rodata` read-only data (non-executable) * `text` executable data (read-only) ## Allocating stack another pseudo-op is recognized: `.stack `. This marks the executable as requesting at least `` bytes of stack. If the loader respects this wish, the sp is initialized pointing to the end of the stack.