RISC-V学习基础(五)

本文详细介绍了C程序如何通过编译、汇编、链接过程转化为RISC-V机器语言,涉及函数调用规范、寄存器使用策略、伪指令以及浮点数处理。讲解了RISC-V指令集中的乘法、除法、浮点运算指令,以及浮点数的加载、存储和转换。此外,还讨论了静态链接与动态链接的区别以及加载器的角色。

RISC-V汇编语言

C程序翻译成为可以在计算机上执行的机器语言程序的四个经典步骤。
在这里插入图片描述

函数调用规范(Calling convention)

函数调用过程通常分为6个阶段:

  1. 将参数存储到函数能够访问的位置。
  2. 跳转到函数开始位置(使用RV32I的jal指令jump and link)。
  3. 获取函数需要的局部存储资源,按需保存寄存器。
  4. 执行函数中的指令。
  5. 将返回值存储到调用者能够访问到的位置,恢复寄存器,释放局部资源。
  6. 返回调用函数的位置(使用ret指令)。

为了获得良好的性能,变量应该尽量存放在寄存器中,而不是内存中,但同时也要注意避免频繁地保持和恢复寄存器,因为它们同样会访问内存。
RISC-V有足够多的寄存器来达到两全其美的结果:既能将操作数存放在寄存器中,同时也能减少保存和恢复寄存器的次数。
其中关键点在于,在函数调用的过程中不保留部分寄存器存储的值(临时寄存器的值/另一些寄存器则对应称为保存寄存器)。不再调用其它函数的函数称为叶函数,当一个叶函数只有少量的参数和局部变量时,它们可以都被存储在寄存器中,而不会溢出spilling到内存中。如果函数参数和局部变量很多,程序还是需要把寄存器的值保存在内存中,但这种情况不多见。

函数调用中的寄存器:

  • 当做保存寄存器来使用,在函数调用前后值不变。
  • 当做临时寄存器来使用,函数调用中不保留。
  • 函数会更改用来保存返回值的寄存器,因此它们和临时寄存器类似。
  • 用来给函数传递参数的寄存器也不需要保留,它们也类似于临时寄存器。
  • 用于存储返回地址的寄存器和存储栈指针的寄存器,要保证函数调用前后保持不变。
  • 图3.2列出了寄存器的RISC-V应用程序二进制接口(ABI)名称和它们在函数调用中是否保留的规定。
    在这里插入图片描述
    根据ABI规范,标准的RV32I函数入口:
entry_label:
	addi sp,sp,-framesize # 调整栈指针(sp寄存器)分配栈帧
	sw ra,framesize-4(sp) # 保存返回地址
	# 按需保持其它寄存器
	# 函数体

如果参数和局部变量太多,在寄存器中存不下,函数的开头会在栈中为函数帧分配空间来存放。当一个函数的功能完成后,它的结尾会释放栈帧并返回调用点。

# 按需恢复其它寄存器
lw ra,framesize-4
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值