一起学RISC-V汇编第6讲之伪指令列表
一起学RISC-V汇编第6讲之伪指令
伪指令是方便程序员使用,相当于为实际指令取的别名,编程时可以直接使用伪指令。
上一章已经列出了RISC-V中的伪指令,只是比较分散,这一章以另一个视角重新整理一下伪指令,表格来源于《RISC-V 开放架构设计之道 1.0.0》
1 RISC-V伪指令列表
伪指令一共60条,分为依赖零寄存器x0的32条伪指令以及与零寄存器x0 无关的28条伪指令。
1.1 依赖零寄存器x0的32条伪指令
| 伪指令 | 基础指令 | 指令集 | 含义 |
|---|---|---|---|
| nop | addi x0, x0, 0 | RV32I/RV64I | 空操作 |
| neg rd, rs | sub rd, x0, rs | RV32I/RV64I | 取负 |
| negw rd, rs | subw rd, x0, rs | 仅RV64I | 取负字 |
| snez rd, rs | sltu rd, x0, rs | RV32I/RV64I | 不等于0时置位 |
| sltz rd, rs | slt rd, rs, x0 | RV32I/RV64I | 小于0时置位 |
| sgtz rd, rs | slt rd, x0, rs | RV32I/RV64I | 大于0时置位 |
| beqz rs, offset | beq rs, x0, offset | RV32I/RV64I | 等于0时分支 |
| bnez rs, offset | bne rs, x0, offset | RV32I/RV64I | 不等于0时分支 |
| blez rs, offset | bge x0, rs, offset | RV32I/RV64I | 小于等于0时分支 |
| bgez rs, offset | bge rs, x0, offset | RV32I/RV64I | 大于等于0时分支 |
| bltz rs, offset | blt rs, x0, offset | RV32I/RV64I | 小于0时分支 |
| bgtz rs, offset | blt x0, rs, offset | RV32I/RV64I | 大于0时分支 |
| j offset | jal x0, offet | RV32I/RV64I | 跳转 |
| jr rs | jalr x0, rs, 0 | RV32I/RV64I | 寄存器跳转 |
| ret | jalr x0, x1, 0 | RV32I/RV64I | 从子过程中返回(子函数返回) |
| tail offset | auipc x6, offset[32:12] jalr x0, x6, offset[11:0] |
RV32I/RV64I | 尾调用远距离子过程 |
| rdinstret[h] rd | csrrs rd, instret[h], x0 | 读已提交指令计数器 | |
| rdcycle[h] rd | csrrs rd, cycle[h], x0 | 读周期计数器 | |
| rdtimeh[h] rd | csrrs rd, time[h], x0 | 读实时时钟 | |
| csrr rd, csr | csrrs rd, csr, x0 | RV32I/RV64I | CSR 读 |
| csrw csr, rs | csrrw x0, csr, rs | RV32I/RV64I | CSR 写 |
| csrs csr, rs | csrrs x0, csr, rs | RV32I/RV64I | CSR置位 |
| csrc csr, rs | csrrc x0, csr, rs | RV32I/RV64I | CSR清位 |
| csrwi csr, imm | csrrwi x0, csr, imm | RV32I/RV64I | CSR写立即数 |
| csrsi csr, imm | csrrsi x0, csr, imm | RV32I/RV64I | CSR置位立即数 |
| csrci csr, imm | csrrci x0, csr, imm | RV32I/RV64I | CSR清位立即数 |
| frcsr rd | csrrs rd, fcsr, x0 | RV32F/RV64F | 读浮点csr寄存器 |
| fscsr rs | csrrw x0, fcsr, rs | RV32F/RV64F | 写浮点csr寄存器 |
| frrm rd | csrrs rd, frm, x0 | RV32F/RV64F | 读浮点写入模式 |
| fsrm rs | csrrw x0, frm, rs | RV32F/RV64F | 写浮点写入模式 |
| frflags rd | csrrs rd, fflags, x0 | RV32F/RV64F | 读浮点异常标志 |
| fslags rs | csrrw x0, fflags, rs | RV32F/RV64F | 写浮点异常标志 |
1.2 与零寄存器x0 无关的28条伪指令
| 伪指令 | 基础指令 | 指令集 | 含义 |
|---|---|---|---|
| lla rd, symbol | auipc rd, symbol[31:12] add rd, rd, symbol[11:0] |
RV32I/RV64I | 装入局部地址 |
| la rd, symbol | PIC: auipc rd, GOT[symbol][31:12] l {w|d} rd, GOT[symbol][11:0](rd) 非PIC: 与 lla rd, symbol 相同 |
RV32I/RV64I | 装入地址 |
| l{b|h|w|d} rd, symbol | auipc rd, symbol[31:12] l{b|h|w|d} rd, symbol[11:0](rd) |
读全局符号 | |
| s{b|h|w|d} rd, symbol, rt | auipc rt, symbol[31:12] s{b|h|w|d} rd, symbol[11:0](rt) |
写全局符号 | |
| fl{w|d} rd, symbol, rt | auipc rt, symbol[31:12] fl{w|d} rd,symbol[11:0](rt) |
读全局浮点符号 | |
| fs{w|d} rd, symbol, rt | auipc rt, symbol[31:12] fs{w|d} rd,symbol[11:0](rt) |
写全局浮点符号 | |
| li rd, imm | 多种指令组合 | RV32I/RV64I | 装入立即数 |
| mv rd, rs | addi rd, rs, 0 | RV32I/RV64I | 复制寄存器 |
| not rd, rs | xori rd, rs, -1 | RV32I/RV64I | 取反 |
| sext.w rd, rs | addiw rd, rs, 0 | 仅RV64I | 符号字扩展 |
| seqz rd, rs | sltiu rd, rs, 1 | RV32I/RV64I | 等于0时置位 |
| fmv.s rd, rs | fsgnj.s rd, rs, rs | RV32F/RV64F | RV32F/RV64F复制单精度寄存器 |
| fabs.s rd, rs | fsgnjx.s rd, rs, rs | RV32F/RV64F | 单进度浮点绝对值 |
| fneg.s rd, rs | fsgnjn.s rd, rs, rs | RV32F/RV64F | 单精度浮点相反数 |
| fmv.d rd, rs | fsgnj.d rd, rs, rs | RV32D/RV64D | 复制双精度寄存器 |
| fabs.d rd, rs | fsgnjx.d rd, rs, rs | RV32D/RV64D | 单精度浮点相反数 |
| fneg.d rd, rs | fsgnjn.d rd, rs, rs | RV32D/RV64D | 双精度浮点相反数 |
| bgt rs, rt, offset | blt rt, rs, offset | RV32I/RV64I | 大于时分支 |
| ble rs, rt, offset | bge rt, rs, offset | RV32I/RV64I | 小于等于时分支 |
| bgtu rs, rt, offset | bltu rt, rs, offset | RV32I/RV64I | 无符号大于时分支 |
| bleu rs, rt, offset | bgeu rt, rs, offset | RV32I/RV64I | 无符号小于等于时分支 |
| jal offset | jal x1, offset | RV32I/RV64I | 跳转并链接 |
| jalr rs | jalr x1, rs, 0 | RV32I/RV64I | 寄存器跳转并链接 |
| call offset | auipc x1, offset[31:12] jalr x1, offset[11:0](x1) |
RV32I/RV64I | 调用远距离过程 |
| fence | fence iorw, iorw | RV32I/RV64I | 内存和I/O屏障 |
| fscsr rd, rs | csrrw rd, fcrs, rs | RV32F/RV64F | 交换浮点csr寄存器 |
| fsrm rd, rs | csrrw rd, frm, rs | RV32F/RV64F | 交换浮点舍入模式 |
| fsflags rd, rs | csrrw rd, fflags, rs | RV32F/RV64F | 交换浮点异常标志 |
参考:

浙公网安备 33010602011771号