571
社区成员
发帖
与我相关
我的任务
分享RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。
RISC-V 被设计成可以支持丰富的定制化和特殊化。基本整数 ISA 可被一个或者多个可选 指令集扩展进行增强,但是基本整数指令集不能被重新定义。最基础的指令是RV32I,即32位的指令。这个是所有的RISC-V处理器都需要实现的指令。RISC-V体系结构可以在这个基础指令集上进行扩展:RV64I,这是64位的基础指令扩展;RV32M是乘法指令扩展;RV32F是单精度浮点扩展;RV32D是双精度浮点扩展等。RV32IMFD就代表了把对应的模块扩展到基础的RV32I中。本文只讨论RV32I。
RV32I 基础指令集总共定义了 32 个 32 位的通用寄存器。它们分别被标记为x0 ~ x31。其中零号寄存器 x0 是只读寄存器,其值永远为零。在用汇编语言编写时,这 32 个寄存器的名称也根据其在调用约定中的职能而被重新命名。具体如下表
| 寄存器名称 | 汇编名称 | 功能描述 | 调用返回后其值是否会保证不变 |
|---|---|---|---|
|
x0 | zero | 零寄存器 | 未定义 |
| x1 | ra | 返回地址 | 否 |
| x2 | sp | 栈指针 | 是 |
| x3 | gp | 全局指针 | 未定义 |
| x4 | tp | 线程指针 | 未定义 |
| x5 | t0 | 临时寄存器 | 否 |
| x6 | t1 | 临时寄存器 | 否 |
| x7 | t2 | 临时寄存器 | 否 |
| x8 | s0/fp | 该寄存器需要被调函数予以保存,或也可用作调用栈的帧指针 | 是 |
| x9 | s1 | 该寄存器需要被调函数予以保存 | 是 |
| x10~x11 | a0~a1 | 函数参数或返回值 | 否 |
| x12~x17 | a2~a7 | 函数参数 | 否 |
| x18~x27 | s2~s11 | 该寄存器需要被调函数予以保存 | 是 |
| x28~x31 | t3~t6 | 临时寄存器 | 否 |
除32个通用寄存器外,RSIC-V还定义一个PC寄存器,该寄存器指向当前正在执行的指令的内存地址。
RISC-V 的指令集设计非常的精简,其只包含如下六种基本指令:
具体格式如下所示:

//
// Created by justx on 2022/5/17.
//
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int main()
{
int a=1,b=2;
printf("Hello World!\n");
printf(add(a,b));
printf(sub(a,b));
return 0;
}

1. 执行 gcc -E hello.c -o hello.i 对C代码进行预处理
2. cat 查看 hello.i
3. 把c语言代码转化称相应汇编代码
执行 gcc -S hello.i -o hello.s
查看 hello.s 为汇编代码

4.汇编,对生成的汇编程序hello.s进行处理,生成处理器识别的指令。执行下面的命令,生成目标文件hello.o。目标文件为elf格式的可重定向文件。
//gcc的-c选项在生成目标文件后停止
gcc -c hello.s -o hello.o
或者直接调用汇编器as
as -c hello.s -o hello.o
学号:297