RISC-V汇编分析

leimingfu 2022-05-17 21:05:42

 

一、RISV简介

本部分知识归纳自RISCV 入门 (学习笔记),感谢博主分享!

1.指令集

        RISC-V是一个典型三操作数、加载-存储形式的RISC架构,包括三个基本指令集和6个扩展指令集,如表1所示,其中RV32E是RV32I的子集,不单独计算。

 

 2.可配置的通用寄存器组

        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的全过程,感谢博主的分享!

1.安装git

sudo apt-get install git

2.安装所需要的环境

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

3.安装riscv

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 

三、编写c代码

vim test.c

 

四、将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 

...全文
568 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧