RISC-V 指令格式

RISC-V 宗旨 —— 简约

RISC-V 指令集架构(ISA)作为新一代开源指令集架构,是一个最新的、简约的、清晰的、开源的指令集架构。RISC-V 指令集架构的目标是让它在最小的到最快的所有计算机设备上都能够有效工作。RISC-V 指令集架构强调简洁性来保证它的低成本,同时有着大量的寄存器和透明的指令执行速度,从而帮助编译器和汇编语言程序员将实际的重要问题转换为适当的高效代码。

计算机指令即:汇编指令代码

计算机指令是能够被计算机识别并执行的二进制代码,它规定了计算机能完成的某种操作;

计算机指令通常由两部分操作:操作码和操作数(地址码)。

操作码 操作数(地址码)

RISC-V 指令格式

操作码 opcode

  • 指令中的操作码:指出该指令需要完成操作的类型或性质;
  • 例如,取数、加法、减法、输出等不同的操作具有不同的操作码;
  • 指令中操作码的二进制位数决定了该种计算机最多能具有的指令条数(即操作种类);

地址码

  • 指令中的地址码:用来描述该指令的操作对象
  • 或者直接给出操作数
  • 或者指出操作数的存储器地址或寄存器地址(即寄存器名)
  • 根据指令中操作码的性质,操作数又分为源操作数和目的操作数;
  • 例如:在一般的加法指令中又3个操作数,其中加法和被加数为源操作数,计算结果为目的操作数;
  • 在大多数指令中,指令中给出的操作数一般是存放数据的地址,而并不是具体数据本身,甚至在有些指令中实际上给出的只能是地址而不是数据;
  • 每一条指令的地址码个数是不同的

1、RISC-V 指令类型

计算机指令所占的字节数是各不相同的,只占一个字节的指令称为单字节指令,占两个字节的指令称为双字节指令,一般来说,如果指令中的操作码和操作数(即地址码)共占 n 个字节,则称该指令为 n 字节指令,RISC-V指令集的所有的指令都是32位长度,这简化了指令解码的工作。

ARM-32 和 x86-32 都有许多不同的指令格式,这使得解码部件在硬件中实现较昂贵,在中高端处理器设计中容易带来性能挑战。

RISC-V 指令具有六种基本指令格式:

  • R 类型指令:用于寄存器 - 寄存器操作;
  • I 类型指令:用于短立即数和访存 load 操作;
  • S 类型指令:用于访存 store 操作;
  • B 类型指令:用于条件跳转操作;
  • U 类型指令:用于长立即数操作;
  • J 类型指令:用于无条件操作;

RISC-V 指令格式

RISC-V 指令格式

为方便程序员,所有位全部为0 是非法的 RV32I 指令,因此试图跳转到被清零的内存区域的错误跳转将会立即触发异常,这可以协助调试;类似的所有位全部都是1的指令也是非法指令,它将捕获其他常见的错误。

RISC-V 指令提供3个寄存器操作数,而不像 x86-32一样,让源操作数和目的操作数共享一个字段。让一个操作天然就需要有三个不同的操作数,但是指令集架构(ISA)只提供了两个操作数时,编译器或者汇编程序员就需要多使用一条 move 指令来保存目的寄存器的值。

在 RISC-V 中对于所有指令,要读写的寄存器的标识符总是在同一个位置,这不仅对解码部件要求降低,而且也意味着在解码指令之前,就可以先开始访问寄存器。

指令格式中的立即数字段总是符号扩展,符号位总是在指令中最高位,这意味着可能成为关键路径的立即数符号扩展,可以在指令解码之前进行。

2、计算机指令的寻址方式

指令中操作数的真实地址称为有效地址,它是由寻址方式和形式地址共同来决定的。

寻址方式是指确定本条指令的数据地址以及下一条将要执行的指令的地址,与硬件结构密切相关。寻址方式分为指令寻址和数据寻址两大类。

指令寻址分为顺序寻址和跳转寻址两种。

常见的数据寻址方式包括立即寻址、直接寻址、隐含寻址以及更复杂的寻址方式,如:间接寻址、寄存器寻址、寄存器间接寻址和堆栈寻址等方式。

3、指令执行的基本过程

计算机的工作就是自动快速地执行程序。在计算机中,用程序计数器(PC)来决定程序中各条指令的执行顺序。在计算机开始执行程序时,程序计算器为该执行程序的第一条指令所在的内存单元地址,此后按照如下步骤依次执行程序中的各指令。

  • 取指令
    按照程序计数器中的地址,从内存器中取出当前要执行的指令送到指令寄存器;
  • 解析指令
    对指令寄存器中的指令进行解析,由译码器对指令中的操作码进行译码,将指令中的操作码转换成相应的控制信息。由指令中的地址码确定操作数存放的地址;
  • 执行指令
    由操作控制电路发出完成该操作所需要的一系列控制信息,对由源地址码所指出的源操作数做该指令所要求的的操作,并将操作结果存放到由目的地址码所指出的地方。
  • 修改程序计数器
    一条指令执行完后,根据程序的要求修改程序计算器(PC)的值,如果当前执行完的指令中不产生转移地址,则将程序计数器(PC)加 n (当前执行完的指令是 n 字节指令);如果当前执行完的指令是转移指令,则将转移地址送入程序计数器,最后转(1)继续执行。

CPU 从内存中取出一条指令解析并执行,一条指令执行完后,再从内存取出下一条指令分析并执行。CPU 不断地取指令、分析指令、执行指令,这就是程序的执行过程。

版权声明:本文为CSDN博主「ViatorSun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ViatorSun/article/details/104784937

最新文章