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

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章详述。

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

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

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第三篇.我尽量每周四篇 MIPS指令集架构自上世纪80年代出现后.一直在进行着更新换代,从最初的MIPS I到MIPS V,发 ...

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

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第六篇.我尽量每周四篇 2.3 Verilog HDL简单介绍 本书实现的OpenMIPS处理器是使用Verilog HDL编 ...

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

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第11篇,我尽量每周四篇 第4章 第一条指令ori的实现 前面几章介绍了非常多预备知识,也描绘了即将要实现的OpenMIPS处 ...

  4. 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图

    我们会继续上传新书<自己动手写处理器>(未公布).今天是第十条.我每星期试试4 从本章開始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍 ...

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

    将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储载入指令:链接载入指令LL.条件存储指令SC,本次将介绍这两条指令.在兴许将实现这两条指令. 9 ...

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

    将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...

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

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第五篇,我尽量每周四篇         通过上一章的介绍,读者应该知道CPU内部有一些主要的电路,比方:译码电路.运算电路.控 ...

  8. 自己动手写CPU之第九阶段(4)——载入存储指令实现思路

    将陆续上传新书<自己动手写CPU>,今天是第40篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...

  9. 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

    将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...

随机推荐

  1. struts2笔记02-action和Action类

    1.action      action表示一个struts2的请求! 2.Action类 能够处理struts2请求的类. (1)属性的名字需要与JavaBeans属性保持一致. 属性的类型可以是任 ...

  2. numpy 札记

    transpose 在处理caffe读入的图片数据时,需要将原始图片的数据 H*W*3(height*width*RGB) 转换为 3*H*W(RGB*heigth*width) 需要用到numpy的 ...

  3. CSS自学笔记(7):CSS定位

    很多时候,我们需要对一些元素进行自定义排序.布局等,这是就需要用到CSS的定位属性了,用这些属性对一些元素进行自定义排序.布局等操作,可以改变浏览器默认的死板的排序. CSS定位的功能很容易理解,它允 ...

  4. web中webAppRootKey作用

    <context-param> <param-name>webAppRootKey</param-name> <param-value>bgn.root ...

  5. 移动跨平台开发框架Ionic开发一个新闻阅读APP

    移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...

  6. Python 模块的一般处理

    因为Python模块在被导入时,定义在模块中的顶级代码是会被执行的!如果我们想改变这种运行方向可以这样做: if __name__ == '__main__':#当这个模块作为主程序时__name__ ...

  7. J2SE知识点摘记(九)

    1.         线程操作的一些方法 方法名称              方法说明 public static int activeCount()             返回线程组中目前活动的线 ...

  8. rsyslog start with

    startswith Checks if the value is found exactly at the beginning of the property value. For example, ...

  9. 获取考试成绩的sql语句

    as score,t_answer.id,t_answer.exams_name,t_answers.answer_id,t_answers.questions_id,t_answers.questi ...

  10. centos6.5vpn搭建

    centos6.5vpn搭建整个搭建流程,服务端,客户端安装及测试. 达到的效果: 在安装vpn客户端的机器可通过vpn(virtual private network)专用线路(vpn主配置文件中定 ...