risc-v 很一部分来源 riscv-operating-system-mooc 这个项目,b站也有教程
有一些我的心得, 方便应用开发的人了解底层的知识。用架构的思维去看底层吧
c 语言的函数
# void _start()
# {
# // calling leaf routine
# square(3);
# }
#
# int square(int num)
# {
# return num * num;
# }
risc-v的函数
.text #定义代码段,后续的所有都在这个段内
.global _start #定义全局变量,开始的地方
_start:
la sp, stack_end # sp 栈顶的位置, 这个位置在哪里呢?代码段的最后。
li a0, 3 # a0是给函数传递参数, 为啥是a0呢?因为寄存器的使用有规范
call square # call做了什事情?相当于把stop的变量地址放到了 ra寄存器里面
stop: # 相当于声明了stop的变量
j stop
square:
addi sp, sp, -16 #相当于申请了栈空间去使用,
sw s0, 0(sp) #s寄存器被调用者维护,使用之前要保存之前的状态,好后面恢复
sw s1, 4(sp) #s0,s1,s2~s11,是save寄存器
mv s0, a0 #读取参数,放到s0中
mul s1, s0, s0 #mul乘法,结果放到s1 中
mv a0, s1 #返回结果
# epilogue
lw s0, 0(sp) #开始恢复原来s寄存器的值
lw s1, 4(sp)
addi sp, sp, 16 #sp寄存器也是被调用者来维护的
ret #把ra的寄存器的值放到pc寄存器里面执行
# add nop here just for demo in gdb
nop
stack_start:
.rept 12 #重复执行12次
.word 0 #
.endr #重复执行结束
stack_end: # 相当于变量的地址
.end # End of file
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。