You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
riscemu/docs/assembly.md

40 lines
1.6 KiB
Markdown

# 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 <len>` reverse <len> 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
## 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 <len>`. This marks the executable as requesting at least `<len>` bytes of stack.
If the loader respects this wish, the sp is initialized pointing to the end of the stack.