自己动手写处理器之第一阶段(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编码进行程序设计,但是那样显然太不方便、容易出错,于是人们使用一些助记符来表示各种指令,这就是汇编指令,使用汇编程序将汇编指令翻译为计算机可以识别的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章详述。

自己动手写处理器之第一阶段(3)——MIPS32指令集架构简介,布布扣,bubuko.com

时间: 2024-10-09 22:17:12

自己动手写处理器之第一阶段(3)——MIPS32指令集架构简介的相关文章

自己动手写处理器之第一阶段(2)——MIPS指令集架构的演变

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第三篇,我尽量每周四篇 MIPS指令集架构自上世纪80年代出现后,一直在进行着更新换代,从最初的MIPS I到MIPS V,发展到可支持扩展模块的MIPS32.MIPS64系列,再到集成代码压缩技术的microMIPS32.microMIPS64.每个MIPS ISA都是其前一个的超集,没有任何遗漏,只有增加新的功能.       1.MIPS Ⅰ 提供加载/存储.计算.跳转.分支.协处理及其它特殊指令.该指令集架构用于最初的MIP

自己动手写处理器之第一阶段(1)——计算机的简单模型、架构、指令集

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第二篇,我尽量每周四篇 第1章 处理器与MIPS 时间开始了! --胡风 · 1949 让我们以一句诗意的话,开始本书的阅读. 时间从1971年11月15日开始,那一天,Intel发布了世界上第一款单芯片微处理器4004. 1.1 计算机的简单模型 计算机很复杂,可以听歌.看电影.上网.玩游戏,内部是怎么工作的,这个问题太可怕了,太复杂了. 计算机很简单,只有加.减.乘.除.逻辑.移位.转移.存储.加载等几类可以做的操作,太简单了.

自己动手写处理器之第二阶段(2)——Verilog HDL简介

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第六篇,我尽量每周四篇 2.3 Verilog HDL简介 本书实现的OpenMIPS处理器是使用Verilog HDL编写的,所以本章接下来的几节将介绍Verilog HDL的一些基本知识,包括语法.结构等.因为本书并不是一本讲授Verilog HDL的专门书籍,所以此处介绍的内容并不是Verilog HDL的全部,只是一些基础知识,以及在OpenMIPS处理器实现过程中会使用到的知识.读者如果对Verilog HDL有进一步了解

自己动手写处理器之第四阶段(1)——第一条指令ori的实现

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第11篇,我尽量每周四篇 第4章 第一条指令ori的实现 前面几章介绍了很多预备知识,也描绘了即将要实现的OpenMIPS处理器的蓝图,各位读者是不是早已摩拳擦掌,迫切希望一展身手了,好吧,本章我们将实现OpenMIPS处理器的第一条指令ori,为什么选择这条指令作为我们实现的第一条指令呢?答案就两个字--简单,指令ori用来实现逻辑"或"运算,选择一条简单的指令有助于我们排除干扰,将注意力集中在流水线结构的实现

自己动手写处理器之第三阶段——教学版OpenMIPS处理器蓝图

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第十篇,我尽量每周四篇 从本章开始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍了系统的设计目标,其中详细说明了OpenMIPS处理器计划实现的5级流水线.3.2节给出了OpenMIPS处理器的接口示意图,及各个接口的作用.3.3节简单解释了各个源代码文件的作用.最后描述了OpenMIPS处理器的实现方法,读者将发现本书给出的实现方法与现有书籍的方法完全不同,更加易于理解.便于实践

自己动手写处理器之第二阶段(3)——Verilog HDL行为语句

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第七篇,我尽量每周四篇 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包括有过程语句,过程语句有两种:initial.always.其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的.此外,always过程语句是可综合的,initial过程语句是不可综合的.       1.always过程语句 always过程语句的格式如图2-10所示.

自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第五篇,我尽量每周四篇 通过上一章的介绍,读者应该知道CPU内部有一些基本的电路,比如:译码电路.运算电路.控制电路,此外还有一些寄存器等.这些电路怎么实现呢?当然可以通过一大堆分立的元器件实现,实际上在2008年,美国加州的游戏开发人士Steve Chamberlin就自己制造了一款8位CPU,耗时18个月,花费1000美元,总共使用了1253条线缆,如图2-1所示,Steve Chamberlin为它起了一个十分贴切的名字--B

自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明

将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储加载指令:链接加载指令LL.条件存储指令SC,本次将介绍这两条指令,在后续将实现这两条指令. 9.6 链接加载指令ll.条件存储指令sc说明 在本章前面的部分,笔者花费很多笔墨介绍了OpenMIPS中除ll.sc之外的加载.存储指令的实现过程,本节至9.9节将专门介绍链接加载指令ll.条件存储指令sc的实现过程.ll.sc指令是MIPS32指令集架构中比较特殊的加载存储指令,用来实现信号量机制. 在多线

自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)

将陆续上传新书<自己动手写CPU>,今天是第42篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 9.3.2 修改执行阶段 1.修改EX模块 在执行阶段的EX模块会计算加载存储的目的地址,参考图9-19可知,EX模块会增加部