Calling conventions and stack frames RISC-V
这节课主要是熟悉 RISC-V 处理器、汇编语言以及 RISC-V 的 calling convention。
# 1. C 到 assembly 的转换
这里简单看一下 C 语言是如何转换为汇编语言的。
通常来说,C 语言会有一个 main 函数,但处理器并不能理解 C 语言,它只能理解汇编语言(二进制后的汇编代码)。
当我们说到一个 RISC-V 处理器的时候,意味着这个处理器能够理解 RISC-V 的指令集。所以,任何一个处理器都有一个关联的 ISA(Instruction Sets Architecture)。当处理器运行时,看到这些指令编码,就知道该做什么样的操作了。
我们首先写出一个 C 程序,之后这个程序需要经过链接和其他步骤,被编译为汇编语言,之后汇编语言会被翻译成二进制文件(.o
文件或者 .obj
文件)。
这就是计算机能够理解我们 C 代码的基本流程。
# 2. RISC-V 和 x86
x86 属于 CISC(复杂指令集),RISC-V 属于 RISC(Reduced Instruction Set Computer),两者存在一些关键区别:
- 指令的数量。x86-64 为了向后兼容,大约有 15000 多条指令,相比之下,RISC-V 就小得多了。
- RISC-V 指令也更加简单。x86-64 中每条指令都执行了一些复杂操作并返回结果,但 RISC-V 的指令趋向于完成更简单的工作,相应的也消耗更少的 CPU 执行时间。
- RISC-V 是开源的,也是市场上唯一的开源指令集,这意味着任何人都可以为 RISC-V 开发主板。
如果查看RISC-V的文档,可以发现RISC-V的特殊之处在于:它区分了Base Integer Instruction Set和Standard Extension Instruction Set。Base Integer Instruction Set包含了所有的常用指令,比如add,mult。除此之外,处理器还可以选择性的支持Standard Extension Instruction Set。例如,一个处理器可以选择支持Standard Extension for Single-Precision Float-Point。这种模式使得RISC-V更容易支持向后兼容。 每一个RISC-V处理器可以声明支持了哪些扩展指令集,然后编译器可以根据支持的指令集来编译代码。