自己动手写处理器之第一阶段(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章详述。
自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍的更多相关文章
- 自己动手写处理器之第一阶段(2)——MIPS指令集架构的演变
将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第三篇.我尽量每周四篇 MIPS指令集架构自上世纪80年代出现后.一直在进行着更新换代,从最初的MIPS I到MIPS V,发 ...
- 自己动手写处理器之第二阶段(2)——Verilog HDL简单介绍
将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第六篇.我尽量每周四篇 2.3 Verilog HDL简单介绍 本书实现的OpenMIPS处理器是使用Verilog HDL编 ...
- 自己动手写处理器之第四阶段(1)——第一条指令ori的实现
将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第11篇,我尽量每周四篇 第4章 第一条指令ori的实现 前面几章介绍了非常多预备知识,也描绘了即将要实现的OpenMIPS处 ...
- 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图
我们会继续上传新书<自己动手写处理器>(未公布).今天是第十条.我每星期试试4 从本章開始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍 ...
- 自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储载入指令:链接载入指令LL.条件存储指令SC,本次将介绍这两条指令.在兴许将实现这两条指令. 9 ...
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
- 自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程
将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第五篇,我尽量每周四篇 通过上一章的介绍,读者应该知道CPU内部有一些主要的电路,比方:译码电路.运算电路.控 ...
- 自己动手写CPU之第九阶段(4)——载入存储指令实现思路
将陆续上传新书<自己动手写CPU>,今天是第40篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...
- 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)
将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...
随机推荐
- codeforces 645E . Intellectual Inquiry
题目链接 如果不考虑重复的元素, 那么我们可以很容易的发现, 长度为n的字符串它的子串数量是 $ 2^n $ . 我们设每个到位置i, 答案的数量为f[i]. 然后我们考虑重复的, 我们发现, 每加入 ...
- 简单的实现树莓派的WEB控制
最终效果如图: 用到的知识:Python Bottle HTML Javascript JQuery Bootstrap AJAX 当然还有 linux 我去,这么多--我还是一点一点说起吧-- 先贴 ...
- sim卡中电话本(ADN)的简要格式
ADN的格式 ADN存放于sim卡下面3f00/7f10/6f3a,记录文件格式,其最小记录格式为14,最长为255(?),记录个数最大为255(?) 其后数14个字节是必有的,其前12个字节是电话号 ...
- 《Linux 设备驱动程序》读后感。 并发,竞态,死锁。
1. 概念 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. 来源: 1. Linux ...
- LA 5966 Blade and Sword (双向bfs + 想法) - from lanshui_Yang
题目大意:给你一张有n * m个网格的图,每个网格可能是如下符号: “#”:墙 “P”:出发点 “D”:终点 “.”:空地 “*”:传送机 有一个旅行家(假设名叫Mike),他要从点P到达点D,途中必 ...
- [poj 2978]Colored Stones[状态压缩DP]
题意: 给出n个石子,一共m种颜色.问最少去掉几个石子使得同种颜色全连续. 思路见注释. #include <algorithm> #include <cstdio> #inc ...
- 面向对象程序设计-C++_课时30运算符重载——基本规则_课时31运算符重载——原型_课时32运算符重载——赋值_课时33运算符重载——类型转换
区分初始化,赋值 #include <iostream> using namespace std; class Fi { public: Fi() {}//1构造函数 }; class F ...
- #include <algorithm>
1 adjacent_find 查找重复的元素 2 find_if 查找符合条件的第一个元素 3 find_if_not 查找不符合条件的第一个元素 4 for_each 可以遍历每一个元素 5 pa ...
- Numpy之ndarray与matrix
1. ndarray对象 ndarray是numpy中的一个N维数组对象,可以进行矢量算术运算,它是一个通用的同构数据多维容器,即其中的所有元素必须是相同类型的. 可以使用array函数创建数组,每个 ...
- 汉诺塔VII(递推,模拟)
汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...