RISC-V入门汇编语言分析

ROYAL_OAK_ 2022-06-19 23:58:46

RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。(百度百科)

首先需要安装RISCV

  编写一简单的C程序

 使用RISCV编译这个C程序

 

  对使用RISCV编译获得的汇编指令的分析

	.file	"test0.c"
	.option nopic
	.attribute arch, "rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0"
	.attribute unaligned_access, 0
	.attribute stack_align, 16
	.text
	.align	1
	.globl	g
	.type	g, @function
g:
	addi	sp,sp,-32         //修改sp指针,分配32字节栈空间
	sd	s0,24(sp)		      //将s0的8个字节(64bit)压入栈存储位置为sp+24
	addi	s0,sp,32		  //s0=sp+32,s0指向原来栈地址
	mv	a5,a0				  //寄存器a0赋值给a5
	sw	a5,-20(s0)			  //将a5中的字保存到s0-20
	lw	a5,-20(s0)			  //再读回来
	addiw	a5,a5,3			  //a5=a5+3
	sext.w	a5,a5
	mv	a0,a5				  //将a5传给a0
	ld	s0,24(sp)			  //恢复s0寄存器
	addi	sp,sp,32		  //恢复栈指针sp
	jr	ra					  //返回
	.size	g, .-g
	.align	1
	.globl	f
	.type	f, @function
f:
	addi	sp,sp,-32		  //修改sp指针,分配32字节栈空间
	sd	ra,24(sp)			  //将ra的8个字节(64bit)压入栈存储位置为sp+24
	sd	s0,16(sp)			  //将s0的8个字节(64bit)压入栈存储位置为sp+16
	addi	s0,sp,32		  //s0=s0+32,s0指向原来栈地址
	mv	a5,a0				  //寄存器a0赋值给a5
	sw	a5,-20(s0)			  //将a5中的字保存到s0-20
	lw	a5,-20(s0)			  //再读回来
	mv	a0,a5				  //再将a5传给a0
	call	g				  //调用函数g
	mv	a5,a0				  //将a0传给a5,其中a0保存了函数g的返回值
	mv	a0,a5				  //再将a5传给a0
	ld	ra,24(sp)			  //恢复ra寄存器
	ld	s0,16(sp)			  //恢复s0寄存器
	addi	sp,sp,32		  //恢复栈指针sp
	jr	ra					  //返回
	.size	f, .-f
	.align	1
	.globl	main
	.type	main, @function
main:
	addi	sp,sp,-16		  //修改sp指针,分配16字节栈空间
	sd	ra,8(sp)			  //将ra的8个字节(64bit)压入栈存储位置为sp+8
	sd	s0,0(sp)			  //将s0的8个字节(64bit)压入栈存储位置为sp+0
	addi	s0,sp,16		  //s0=sp+16,指向原来栈地址
	li	a0,8				  //a0=8
	call	f				  //调用函数f
	mv	a5,a0				  //将a0传给a5,其中a0保存了函数f的返回值
	addiw	a5,a5,1			  //a5=a5+1
	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: () 9.3.0"

099

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

571

社区成员

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

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