Below is a brief summary of common RISC-V instructions. See the Resources page for links to more complete tutorials and readings about RISC-V assembly. We particularly like Eric Engheim's RISC-V cheatsheet:
Registers
There are 32 registers indexed from x0 to x31. Each register has an alias that aids as mnemonic for the register's intended use. We will typically refer to registers by alias name.
| Register | Alias | Conventional use | 
|---|---|---|
| x0 | zero | fixed zero value | 
| x1 | ra | return address | 
| x2 | sp | stack pointer | 
| x3 | gp | global pointer | 
| x4 | tp | thread pointer | 
| x5 | t0 | temporary | 
| x6 | t1 | temporary | 
| x7 | t2 | temporary | 
| x8 | s0/fp | saved by callee, frame pointer | 
| x9 | s1 | saved by callee | 
| x10 | a0 | function argument 1, function return value | 
| x11 | a1 | function argument 2 | 
| x12 | a2 | function argument 3 | 
| x13 | a3 | function argument 4 | 
| x14 | a4 | function argument 5 | 
| x15 | a5 | function argument 6 | 
| x16 | a6 | function argument 7 | 
| x17 | a7 | function argument 8 | 
| x18 | s2 | saved by callee | 
| x19 | s3 | saved by callee | 
| x20 | s4 | saved by callee | 
| x21 | s5 | saved by callee | 
| x22 | s6 | saved by callee | 
| x23 | s7 | saved by callee | 
| x24 | s8 | saved by callee | 
| x25 | s9 | saved by callee | 
| x26 | s10 | saved by callee | 
| x27 | s11 | saved by callee | 
| x28 | t3 | temporary | 
| x29 | t4 | temporary | 
| x30 | t5 | temporary | 
| x31 | t6 | temporary | 
Common instructions
rd: destination register, rs: source register, imm: immediate value (constant)
| Opcode | Instruction | Syntax | Notes | 
|---|---|---|---|
| ALU instructions (R-type) | |||
| ADD | Add | ADD rd,rs1,rs2 | |
| SUB | Subtract | SUB rd,rs1,rs2 | |
| AND | Bitwise and | AND rd,rs1,rs2 | |
| OR | Bitwise or | OR rd,rs1,rs2 | |
| XOR | Bitwise exclusive or | XOR rd,rs1,rs2 | |
| SLL | Shift left logical | SLL rd,rs1,rs2 | |
| SRL | Shift right logical | SRL rd,rs1,rs2 | |
| SRA | Shift right arithmetic | SRA rd,rs1,rs2 | |
| ALU (I-type) | |||
| ADDI | Add immediate | ADDI rd,rs,imm12 | |
| ANDI | And immediate | ANDI rd,rs,imm12 | |
| ORI | Or immediate | ORI rd,rs,imm12 | |
| XORI | Xor immediate | XORI rd,rs,imm12 | |
| SLLI | Shift left logical immediate | SLLI rd,rs,imm12 | |
| SRLI | Shift right logical immediate | SRLI rd,rs,imm12 | |
| SRAI | Shift right arithmetic immediate | SRAI rd,rs,imm12 | |
| Branch instructions | |||
| BEQ | Branch equal | BEQ rs1,rs2,imm12 | target = PC + imm12 (e.g. PC-relative) | 
| BNE | Branch not equal | BNE rs1,rs2,imm12 | |
| BGE | Branch greater or equal | BGE rs1,rs2,imm12 | |
| BLT | Branch less than | BLT rs1,rs2,imm12 | |
| JAL | Jump and link | JAL rd,imm20 | |
| JALR | Jump and link register | JALR rd,imm12(rs) | |
| Load/store instructions | suffixes D=double-word, H=half-word B=byte | ||
| LW | Load word | LW rd,imm12(rs) | |
| SW | Store word | SW rs,imm12(rd) | 
Pseudo instructions
These convenience forms are accepted by the assembler and converted into actual instruction(s).
| Mnemonic | Example | Translation | Notes | 
|---|---|---|---|
| LI | LI rd,imm32 | LUI rd,imm[31:12] ADDI rd,rd,imm[11:0] | Load 32-bit imm (2 insns) | 
| MV | MV rd,rs | ADDI rd,zero,rs | Copy register | 
| NOT | NOT rd,rs | XORI rd,rs,-1 | Bitwise inverse | 
| NEG | NEG rd,rs | SUB rd,zero,rs | Arithmetic negation | 
| J | J imm20 | JAL zero,imm20 | Unconditional jump | 
| CALL | CALL imm20 | JALR ra,ra,imm20 | Function call | 
| RET | RET | JALR zero,0(ra) | Function return | 
More?
This page is just the highlights. Refer to the RISC-V specification for information on:
- control and status registers CSR
- extensions (multiply/divide, compressed, atomic, vector)
- floating point
