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

putao
8 声望3 粉丝

推动世界向前发展,改善民生。