571
社区成员
发帖
与我相关
我的任务
分享
本部分知识归纳自RISCV 入门 (学习笔记),感谢博主分享!
RISC-V是一个典型三操作数、加载-存储形式的RISC架构,包括三个基本指令集和6个扩展指令集,如表1所示,其中RV32E是RV32I的子集,不单独计算。

RISC-V架构支持32位或者64位的架构,32位架构由RV32表示,其每个通用寄存器的宽度为32比特;64位架构由RV64表示,其每个通用寄存器的宽度为64比特。
RISC-V架构的整数通用寄存器组,包含32个(I架构)或者16个(E架构)通用整数寄存器,其中整数寄存器0被预留为常数0,其他的31个(I架构)或者15个(E架构)为普通的通用整数寄存器。
如果使用了浮点模块(F或者D),则需要另外一个独立的浮点寄存器组,包含32个通用浮点寄存器。如果仅使用F模块的浮点指令子集,则每个通用浮点寄存器的宽度为32比特;如果使用了D模块的浮点指令子集,则每个通用浮点寄存器的宽度为64比特。
安装环境:Ubuntu18.04
本教程来自于安装riscv的全过程,感谢博主的分享!
sudo apt-get install git
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev
git clone https://github.com/riscv/riscv-tools.git
cd riscv-tools
git submodule update --init --recursive
git clone https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git submodule update --init --recursive
su
./configure --prefix=/opt/riscv
make -j4
export PATH=/opt/riscv/bin:$PATH
cd ..
export RISCV=/path/to/install/riscv/toolchain
./build.sh
export PATH=/path/to/install/riscv/toolchain/bin:$PATH
vim test.c

riscv64-linux-gnu-gcc -S -o test.s test.c
.file "test.c"
.option pic
.text
.align 1
.globl fun
.type fun, @function
fun:
addi sp,sp,-32 #sp栈顶指针,sp-32,为函数分配空间
sd s0,24(sp) #s0栈底指针
addi s0,sp,32 #s0=sp+32,将s0指向栈底
mv a5,a0 #保存a5
sw a5,-20(s0)
lw a5,-20(s0) #将s0-20中的值存放到a5中
addiw a5,a5,5 #a5=a5+5
sext.w a5,a5 #sign-extend(符号拓展)
mv a0,a5 #a0为函数返回值
ld s0,24(sp) #恢复s0
addi sp,sp,32 #恢复sp
jr ra #无条件跳转到返回地址
.size fun, .-fun
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16 #sp为栈顶指针,sp-16,为函数分配空间
sd ra,8(sp) #ra存储返回地址,存储ra的值
sd s0,0(sp) #s0为栈底指针
addi s0,sp,16 #s0=sp+32,将s0指向栈底
li a0,4 #a0存储4
call fun #调用函数func
mv a5,a0 #a0为函数func的返回值,存入a5
addiw a5,a5,10 #a5=a5+10
sext.w a5,a5 #符号拓展
mv a0,a5 #将a5存入a0,作为函数返回值
ld ra,8(sp) #恢复ra
ld s0,0(sp) #恢复s0
addi sp,sp,16 #恢复sp的值
jr ra #无条件跳转
.size main, .-main
.ident "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0"
.section .note.GNU-stack,"",@progbits
学号:257