RISC_V汇编语言

上图为从 C程序翻译成为可以在计算机上执行的器语言四个经典步骤

函数调用规范(calling convention)

通常分为六个阶段

1.将参数存储到函数能访问到的位置

2.跳转到函数开始位置(jal指令)

3.获取函数需要的局部存储资源,按需保存到寄存器

4.执行函数中的指令

5.将返回值存储到调用者能访问到的位子,恢复寄存器,释放局部存储资源

6.返回调用函数位置(ret指令)

下图列出了寄存器的RISC_V应用程序二进制接口(ABI)名称和它们在函数调用中是否保留规定

RISC_V伪指令集汇编语言

RISC_V主要依赖于X0的伪指令,在RV32I中,读取64位计数器的指令默认读取低32位,增加“h”是读取高32位

不依赖X0的伪指令

下面分别为c语言、RISC_V汇编语言、RISC_V机器语言的Hello World程序

链接器

链接器允许各个文件独立地进行编译和汇编,这样在改动部分文件时,不需要重新编译全部源代码

由于单个32位指令很难指定一个32位地址,RV32I的链接器通常需要位每个标签调整两条指令,如上图3.6中的数据标签调整了lui和addi,代码标签则调整了auipc和jalr

RISC-V 编译器支持多个 ABI,具体取决于 F 和 D 扩展是否存在。RV32 的 ABI 分别名 为 ilp32,ilp32f 和 ilp32d。ilp32 表示 C 语言的整型(int),长整型(long)和指针(pointer) 都是 32 位,可选后缀表示如何传递浮点参数。在 lip32 中,浮点参数在整数寄存器中传递; 在 ilp32f 中,单精度浮点参数在浮点寄存器中传递;在 ilp32d 中,双精度浮点参数也在浮点 寄存器中传递。

补充说明:链接器松弛( linker relaxation)
跳转并链接指令( jump and link)中有 20位的相对地址域,因此一条指令就足够跳到很远 位的相对地址域。尽管编译器为每个外部函数跳转都生成了两条指令,很多时候其实一就已经足够了。从两条指令到一的优化同时节省间和空开销, 因此链接器会扫描几遍代码尽可能地把两条指令替换为一条。每次会导致函数和调用它的位置之间距离缩短,所以链接器会多次扫描替换,直到代码不再改变。这个过程称为链接器松弛,名字来源于求解方程组的松弛技术。除了过程调用之外,对于 gp指针 ±2KiB范围内的数据访问, RISC-V链 接器也会 使用一个全局指针替换掉 lui和 auipc两条指令。对 tp指针 ±2KiB范围内的线程 局部变量访问也有类似的处理。

静态链接(static linking)在程序运行前所有的库都进行了链接和 加载。如果这样的库很大,链接一个库到多个程序中会十分占用内存。另外,链接时库是绑定的,即使它们后来的更新修复了 bug,强制的静态链接的代码仍然会使用旧的、有 bug 的 版本。

为了解决这两个问题,现在的许多系统使用动态链接(dynamic linking),外部的函数在 第一次被调用时才会加载和链接。后续所有调用都使用快速链接(fast linking),因此只会产 生一次动态开销。每次程序开始运行,它都会按照需要链接最新版本的库函数。另外,如果 多个程序使用了同一个动态链接库,库代码在内存中只会加载一次。

编译器产生的代码和静态链接的代码很相似。其不同之处在于,跳转的目标不是实际的 函数,而是一个只有三条指令的存根函数(stub function)。存根函数会从内存中的一个表中 加载实际的函数的地址并跳转。不过,在第一次调用时,表中还没有实际的函数的地址,只 有一个动态链接的过程的地址。当这个动态链接过程被调用时,动态链接器通过符号表找到 实际要调用的函数,复制到内存中,更新记录实际的函数地址的表。后续的每次调用的开销 就是存根函数的三条指令的开销。

汇编器向 RISC-V ISA 中增加了 60 条伪指令,使得 RISC-V 代码更易于读写,并且不增 加硬件开销。将一个寄存器硬编码为 0 使得其中许多伪指令更容易实现。使用加载高位立即 数(lui)和程序计数器与高位立即数相加(auipc)两条指令,简化了编译器和链接器寻找 外部数据/函数的地址的过程。使用相对地址转移的代码与位置无关,减少了链接器的工作。 大量的寄存器减少了寄存器保存和恢复的次数,加速函数调用和返回。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值