zoukankan      html  css  js  c++  java
  • 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍

    将陆续上传本人写的新书《自己动手写处理器》(尚未出版)。今天是第四篇。我尽量每周四篇

    1.4 MIPS32指令集架构简单介绍

          本书设计的处理器遵循MIPS32 Release 1架构,所以本节介绍的MIPS32指令集架构指的就是MIPS32 Release 1。

    1.4.1 数据类型   

          指令的主要任务就是对操作数进行运算。操作数有不同的类型和长度,MIPS32提供的基本数据类型例如以下。

    •   位(b):长度是1bit。

    •   字节(Byte):长度是8bit。

    •   半字(Half Word):长度是16bit。

    •   字(Word):长度是32bit。
    •   双字(Double Word):长度是64bit。

          此外,还有32位单精度浮点数、64位双精度浮点数等。

    1.4.2 寄存器

          在前文介绍RISC的特点时提到一点:大量使用寄存器。这是由于寄存器的存取能够在一个时钟周期内完毕,同一时候也简化了寻址方式。MIPS32的指令中除载入/存储指令外,都是使用寄存器或马上数作为操作数的。

    MIPS32中的寄存器分为两类:通用寄存器(GPR:General Purpose Register)、特殊寄存器。

    1、通用寄存器

          MIPS32架构定义了32个通用寄存器,使用$0、$1……$31表示,都是32位。

    当中$0一般用做常量0。

          在硬件上没有强制指定寄存器的使用规则,可是在实际使用中。这些寄存器的使用方法都遵循一系列约定,比如:寄存器$31一般存放子程序的返回地址。MIPS32中通用寄存器的约定使用方法如表1-1所看到的。

    在本书大部分章节中,測试程序都是直接使用汇编指令编写的,对寄存器的约定使用方法还不须要十分在意,可是本书的最后一章移植μC/OS-II时,由于涉及到C语言、汇编混合编程,对寄存器的约定使用方法就须要十分在意了。读者届时能够体会到表1-1中各个寄存器约定使用方法的作用。

    2、特殊寄存器

          MIPS32架构中定义的特殊寄存器有三个:PC(Program Counter程序计数器)、HI(乘除结果高位寄存器)、LO(乘除结果低位寄存器)。

    进行乘法运算时,HI和LO保存乘法运算的结果,当中HI存储高32位。LO存储低32位;进行除法运算时,HI和LO保存除法运算的结果,当中HI存储余数,LO存储商。

    1.4.3 字节次序

          数据在存储器中是依照字节存放的。处理器也是依照字节訪问存储器中的指令或数据,可是假设须要读出一个字,也就是4个字节,比方读出的是mem[n]、mem[n+1]、mem[n+2]、mem[n+3]这四个字节。那么终于交给处理器的有两种结果。

    •  {mem[n],mem[n+1],mem[n+2],mem[n+3]}
    •  {mem[n+3],mem[n+2],mem[n+1],mem[n]}

          前者称为大端模式(Big-Endian),也称为MSB(Most Significant Byte),后者称为小端模式(Little-Endian),也称为LSB(Least Significant Byte)。在大端模式下,数据的高位保存在存储器的低地址中。而数据的低位保存在存储器的高地址中。图1-4给出0x12345678在两种模式下的存储情况。本书实现的处理器採用的是大端模式(Big-Endian)。

    1.4.4 指令格式

          MIPS32架构中的全部指令都是32位,也就是32个0、1编码连在一起表示一条指令,有三种指令格式。如图1-5所看到的。

    当中op是指令码、func是功能码。

          (1)R类型:详细操作由op、func结合指定,rs和rt是源寄存器的编号,rd是目的寄存器的编号。比方:如果目的寄存器是$3。那么相应的rd就是00011(此处是二进制)。MIPS32架构中有32个通用寄存器,使用5位编码就能够所有表示,所以rs、rt、rd的宽度都是5位。

    sa仅仅有在移位指令中使用。用来指定移位位数。

          (2)I类型:详细操作由op指定。指令的低16位是马上数,运算时要将其扩展至32位。然后作为当中一个源操作数參与运算。

          (3)J类型:详细操作由op指定,通常是跳转指令,低26位是字地址,用于产生跳转的目标地址。

    1.4.5 指令集

          在“计算机的简单使用模型”中已经介绍过,能够直接使用0、1编码进行程序设计,可是那样显然太不方便、easy出错,于是人们使用一些助记符来表示各种指令。这就是汇编指令,使用汇编程序将汇编指令翻译为计算机能够识别的0、1编码。

    也就是将汇编指令翻译为图1-5所看到的的格式,这样处理器就能够识别了。

    MIPS32架构中定义的指令能够分为下面几类。

    注意:当中不包括浮点指令,由于本书实现的处理器不包括浮点处理单元。也就没有实现浮点指令,所以此处不介绍浮点指令。

    1、逻辑操作指令

          有8条指令:and、andi、or、ori、xor、xori、nor、lui,实现逻辑与、或、异或、或非等运算。本书设计的处理器实现了全部逻辑操作指令,将在第4、5章具体介绍各个逻辑操作指令的格式、作用、使用方法,及事实上现过程。

    2、移位操作指令

          有6条指令:sll、sllv、sra、srav、srl、srlv。实现逻辑左移、右移、算术右移等运算。

    本书设计的处理器实现了全部移位操作指令。将在第5章具体介绍各个移位操作指令的格式、作用、使用方法。及事实上现过程。

    3、移动操作指令

          有6条指令:movn、movz、mfhi、mthi、mflo、mtlo。用于通用寄存器之间的数据移动,以及通用寄存器与HI、LO寄存器之间的数据移动。本书设计的处理器实现了全部移动操作指令,将在第6章具体介绍各个移动操作指令的格式、作用、使用方法,及事实上现过程。

    4、算术操作指令

          有21条指令:add、addi、addiu、addu、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、mult、multu、madd、maddu、msub、msubu、div、divu,实现了加法、减法、比較、乘法、乘累加、除法等运算。本书设计的处理器实现了全部算术操作指令,将在第7章具体介绍各个算术操作指令的格式、作用、使用方法,及事实上现过程。

    5、转移指令

          有14条指令:jr 、jalr 、j 、jal、b、bal、beq、bgez、bgezal、bgtz、blez、bltz、bltzal、bne,当中既有无条件转移。也有条件转移,用于程序转移到还有一个地方运行。

    本书设计的处理器实现了全部转移指令。将在第8章具体介绍各个转移指令的格式、作用、使用方法。及事实上现过程。

    6、载入存储指令

          有14条指令:lb、lbu、lh、lhu、ll、lw、lwl、lwr、sb、sc、sh、sw、swl、swr,以“l”開始的都是载入指令,以“s”開始的都是存储指令,这些指令用于从存储器中读取数据,或者向存储器中保存数据。

    本书设计的处理器实现了全部载入存储指令,将在第9章具体介绍各个载入存储指令的格式、作用、使用方法,及事实上现过程。

    7、协处理器訪问指令

          有2条指令:mtc0、mfc0,用于读取协处理器CP0中某个寄存器的值,或者将数据保存到协处理器CP0中的某个寄存器。本书设计的处理器实现了全部协处理器訪问指令,将在第10章具体介绍协处理器、协处理器訪问指令的格式、作用、使用方法,及事实上现过程。

    8、异常相关指令

          有14条指令,当中有12条自陷指令。包含:teq、tge、tgeu、tlt、tltu、tne、teqi、tgei、tgeiu、tlti、tltiu、tnei。此外还有系统调用指令syscall、异常返回指令eret。本书设计的处理器实现了全部异常相关指令,将在第11章具体介绍异常相关指令的格式、作用、使用方法,及事实上现过程。

    9、其余指令

          有4条指令:nop、ssnop、sync、pref,当中 nop是空指令。ssnop是一种特殊类型的空指令,sync指令用于保证载入、存储操作的顺序,pref指令用于缓存预取。本书设计的处理器对这4条指令进行了简化并加以实现。将在第5章具体介绍简化后的实现过程。

    1.4.6 寻址方式

          MIPS32架构的寻址模式有寄存器寻址、马上数寻址、寄存器相对寻址和PC相对寻址四种。当中寄存器相对寻址、PC相对寻址介绍例如以下。

          (1)寄存器相对寻址

          这样的寻址模式主要是载入/存储指令使用,其将一个16位的马上数做符号扩展。然后与指定通用寄存器的值相加。从而得到有效地址,如图1-6所看到的。

          (2)PC相对寻址

          这样的寻址模式主要是转移指令使用。在转移指令中有一个16位的马上数,将其左移两位并作符号扩展,然后与程序计数寄存器PC的值相加,从而得到有效地址。如图1-7所看到的。

    1.4.7 协处理器CP0

          协处理器一词通经常使用来表示处理器的一个可选部件。负责处理指令集的某个扩展,拥有与处理器相独立的寄存器。MIPS32架构提供了最多4个协处理器,各自是CP0-CP3。

    协处理器CP0用作系统控制,CP1、CP3用作浮点处理单元,而CP2被保留用于特定实现。除CP0外的协处理器都是可选的。

    协处理器CP0的详细作用有:配置CPU工作状态、快速缓存控制、异常控制、存储管理单元控制等。CP0通过配置内部的一系列寄存器来完毕上述工作。本书设计的处理器实现了CP0的部分功能。将在第10章详述。

    1.4.8 异常

          在处理器运行过程中,会从存储器中依次取出指令,然后运行。可是有一些事件会打断正常的程序运行流程,这些事件有中断(Interrupt)、陷阱(Trap)、系统调用(System Call)等等,统称为异常。异常发生后,处理器会转移到一个事先定义好的地址,在那个地址有异常处理例程,在当中进行异常处理。这个地址称为异常处理例程入口地址。异常处理完毕后,使用异常返回指令eret,返回到异常发生前的状态继续运行。本书设计的处理器实现了对硬件复位、中断(包括软中断、硬中断)、syscall系统调用、无效指令、溢出、自陷等6种异常的处理,将在第11章详述。

  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5137663.html
Copyright © 2011-2022 走看看