571
社区成员
发帖
与我相关
我的任务
分享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