指令框架(ISA:Instruction Set Architecture)

定义

指令集架构(英语:Instruction Set Architecture,缩写为ISA),又称指令集指令集体系,是计算机体系结构中与程序设计有关的部分,包含了基本数据类型,指令集,寄存器寻址模式存储体系中断异常处理以及外部I/O。指令集架构包含一系列的opcode即操作码(机器语言),以及由特定处理器执行的基本命令。-------- 中文维基百科

个人解说:这个类似与一个标准,和ECMA-335 协议类似.根据这个协议 做出.net framework\mono。根据isa这个规范制作成两个子集 cisc和risc。而后的x86等是这两个子集的具体实现。

指令系统主要分三大内容

  • 想学习指令,肯定要先学会基础的指令格式,知道一条指令包括了什么部分
  • 知道什么是指令之后,我们就要学习指令的执行流程,它是怎么寻址的?这里包括指令如何找到下一步操作寻址(指令寻址),以及指令如何找到操作对象寻址(地址寻址)两个部分。
  • 学会上面两个部分,我们就可以学习如何设计一条指令,这里包括CISC和RISC两种方式

指令的格式

从最基本的结构上来说:一条指令通常要包括操作码字段地址码字段

两部分:

  • 操作码字段告诉用户做什么操作?
  • 地址码
  • 告诉用户对谁操作?

这是基本的指令结构,而一条指令更具体的样子应该是这样的:

这里地址码分为了4部分:其中,A1和A2地址代表的是要操作的对象在哪;A3代表运算存放的结果在哪;A4表示这条指令执行要执行的下一条指令在哪?

用符号可以记录为: (A1)OP(A2)→A3,A4=下一条将要执行指令的地址

举个具体的例子来体会一下指令的存放:

现在我们给出一段指令

这是一条指令

这条指令字长32位:其中操作码(OP) :8位,地址码(A):共4个,每个6位

那么指令访问我们的内存其实就是这样子的:

  • 首先000000这个位置上存放着操作指令(000420C4H)
    000420C4H就是【上方绿色指令】的十六进制
  • A1,A2上存着两串数(12344321H)和(43211234H)
    他们在000000指令的执行下,要进行加法操作,将结果填入到A3中
  • 所以A3中的数据(555555555H)就是A1(12344321H)+A2(43211234H)的和
  • 最后再去A4读取出指令(22343234H),开始下一轮工作

放在一起

我们可以在这个图中看到内存中既有操作码,又有地址码,这样把他们放在一起其实并不好,我们可以优化他们,把操作码放一起,地址码放一块。

分组存放

这样看起来是不是清晰多了呢?而且这样最大的好处是!!!:

将操作码放一块,我们可以让程序执行完一步就自动执行下一句指令,这样我们的指令就不用存放下一条指令的位置了。这样访存的次数少了一次,速度也会快点。

如无例外(指的是跳转指令),执行完就直接下一条继续就好啦,也就是顺序执行。


地址码

通过上面将操作码和地址码分开的操作,通过程序计数器使操作码+1顺序执行,我们的指令少了6位的A4,这6位地址可不能浪费了呀,我们可以将它重新设计,变成这样:

四地址指令变三地址指令

地址码变成了8位了,这样的好处是:原先每一条地址码最多只能寻址到2的6次方也就是64个地址,而现在地址搜寻的范围变成了2的8次方也就是256个地址,这样寻址的范围就大大增加了呀!

按着这个思想,我们又对某些指令进行了优化,比如:

对一些两个数进行操作完后结果覆盖到原来的地址上的数(比如将A1和A2相加,结果返回到A1)我们可以舍去结果位:

二地址指令

这样寻址范围又广了不少:2的12次方=4K

再极端点,对一些进行自身操作的数(比如自增

、自减、取反)我们可以舍去另个操作数和结果位:

一地址指令

最后一种,就是连操作码都全部省去了:

零地址指令

这就是地址码的设计方案总结一下:

  • 我们可以理解,不同的操作,所需要的地址码块数是不同的,所以我们应该灵活安排
  • 即使我们减少了地址码的分块,但是整体指令的长度一直是32位
    这种方式叫定长指令结构。与之相反的就是指令长度不固定的变长指令结构

操作码

刚才我们分析了地址码的设计方式,现在学一下操作码的设计:

在上面的例子中,我们的操作码都是8位,是定长操作码,能发出2的8次方 64条操作。

同样操作码也能设计为不定长的方式,这种操作码叫做拓展操作码

怎么拓展呢?我们以一个字长为16位的指令为例:

如果我们将前面的4位全部用作操作码,则一共能发出0000~1111 16种操作,现在我们稍微设计一下——舍弃一条操作(1111),只发出0000~1110 15种操作

将1111留着作为标记,如果是1111开头的,则代表A1也作操作码

这样就完成了拓展了。

以此类推:

将1111 1111留着作为标记,如果是1111 1111开头的,则代表A2也作操作码

全为操作码,没有地址码--->零地址指令

总结:

  • 通常情况下,对使用频率较高的指令,分配较短的操作码
    对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。
  • 各指令的操作码一定不能重复
  • 拓展操作码不一定只能有一条也就是说不一定只有1111作拓展操作码,对应15条地址,也可以1110、1111都做拓展码,留14条地址指令也行;甚至不要14条地址指令,只要13条、12条也可以,要根据题目本身设计。但是无论如何设计,它都符合一个规律:

  • 操作码有定长操作码也有拓展操作码,他们各有优缺点:

因此,定长操作码一般用在指令长度比较长的机器上,就不用那么拘束调来调去啦直接固定长度简单除暴,拓展操作码对应指令长度有限的机器,需要灵活安排操作码和地址码的长短关系。


操作类型

最后我们再来了解一下操作码究竟能交代哪些操作?

总的来说分4大类:

  • 1.数据传送类:进行CPU和主存之间的数据传送 LOAD作用:把存储器中的数据放到寄存器中
    STORE 作用:把寄存器中的数据放到存储器中
  • 运算类 算术:加、减、乘、除、增1、减1、求补、浮点运算

、十进制运算
逻辑:与、或、非、异或、位操作、位测试、位清除、位求反 移位操作:算术移位

  • 、逻辑移位、循环移位(带进位和不带进位)
  • 程序控制类:改变程序执行的顺序 转移操作:无条件转移 JMP 条件转移 JZ:结果为0; JO:结果溢出;JC:结果有进位调用和返回CALL和RETURN 陷阱(Trap)与陷阱指令
  • 输入输出类(I/0):进行CPU和I/0设备之间的数据传送 输入输出操作:CPU寄存器

与IO端口之间的数据传送(端口即Io接口中的寄存器)

指令框架的分类:

复杂指令集框架(CISC:Complex instruction set computing)

复杂指令集侧重于硬件执行指令的功能性,其对应的硬件结构很复杂。
复杂指令集的特点是指令长度不固定,执行需要多个周期;其有很多用于特定目的的专用寄存器;处理器能够直接处理寄存器中的数据。
复杂指令集主要应用于电脑的处理器,我们的个人电脑处理器用的是X86:

精简指令集框架(RISC:Reduced instruction set computing)

精简指令集计算  这种设计思路可以想像成是一家模块化的组装工厂,对指令数目和寻址方式都做了精简,使其实现更容易,指令并行执行程度更好,编译器的效率更高。目前常见的精简指令集微处理器包括DEC AlphaARCARMAVRMIPSPA-RISCPower ISA(包括PowerPCPowerXCell)、RISC-VSPARC等。

指令集

定义

指令集,顾名思义就是一系列指令的集合 通常也可以称作框架,是ISA的子集。其定义其实比较松散,因为集合可大可小。
指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。

详细学习地址:https://slidesplayer.com/slide/16239003/

作用:

指令集也作为一种标准规范,用于规范芯片设计工程师及编译器开发工程师:

常用的指令集:

X86

X86属于CISC:Complex instruction set computing 复杂指令集框架的子集。x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构。最早的8086处理器于1978年由Intel推出,为16位微处理器。目前x86的主要产品有Intel的至强,酷睿,奔腾,赛扬和凌动;amd的锐龙,apu等。上文提到的x64架构目前只有intel 安腾而且已经放弃了产品线。
早期的x86是cisc的代表,后来的发展中逐步引入了risc的部分理念,将内部指令的实现大量模块化,准确来说是一个cisc外加risc部分技术的架构。

该系列较早期的处理器名称是以数字来表示80x86。由于以“86”作为结尾,包括Intel 8086801868028680386以及80486,因此其架构被称为“x86”。因为接近80年代 所以前两位为80,x86的X是之前表示成品代数,386、486等,现在这一构架被统称为x86。

intel第一代4位:4004

intel第二代8位:8080

intel第三代16位:8086,包括80186、80286、80386

intel第四代32位:80486

intel第五代就是奔腾系列了,也称为80586

看见了吗?从8086开始都有个后缀86,后面产生的86处理器都是兼容以前的86处理器,因为使用的同一个架构,就把这种架构称为x86架构

arm

arm是risc的典型代表,不过在arm的发展过程中引入了部分复杂指令(完全没有复杂指令的话操作系统跑起来异常艰难),所以是一个risc基础外加cisc技术的cpu。

mips

另一个risc的典型处理器就是mips。mips是一个学院派的cpu,授权门槛极低,因此很多厂家都做mips或者mips衍生架构。令系统经过通用处理器指令体系MIPS
I、MIPS II、MIPS III、MIPS IV到MIPS
V,嵌入式指令体系MIPS16、MIPS32到MIPS64的发展已经十分成熟。在嵌入式方面,MIPS
K系列微处理器是仅次于ARM的用得最多的处理器之一(1999年以前MIPS是世界上用得最多的处理器),我们平时接触到的mips架构cpu主要用在嵌入式领域,其应用领域覆盖游戏机、路由器、激光打印机、掌上电脑等各个方面。
目前最活跃的mips是中国的龙芯,其loongisa架构其实是mips的扩展。在设计理念上MIPS指令集强调软硬件协同提高性能,同时简化硬件设计。其指

power cpu

risc的,老苹果用的就是这货

alpha架构

侧重超算,目前貌似最活跃是中国申威,神威太湖之光的cpu就是这货)。

【硬件基础知识】指令集框架(ISA:Instruction Set Architecture)的更多相关文章

  1. 2019企业linux运维最需要的了解的一些硬件基础知识

    第3章 服务器    245 3.1 电脑的种类    245 3.2 服务器的介绍    246 3.2.1 服务器的类别    246 3.2.2 服务器的性能    247 3.2.3 服务器的 ...

  2. iOS蓝牙开发(二)蓝牙相关基础知识

    原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...

  3. iOS蓝牙开发(一)蓝牙相关基础知识(转)

    转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...

  4. IOS 蓝牙相关-基础知识(1)

    蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0 ...

  5. springMVC1 springmvc的基础知识

    springmvc第一天 springmvc的基础知识 springmvc课程安排: 第一天: 基础知识 springmvc框架(重点) mvc在b/s系统中应用方式 springmvc框架原理(Di ...

  6. iOS_SN_BlueTooth( 一)蓝牙相关基础知识

    原文  http://www.cocoachina.com/ios/20150915/13454.html 作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad ,ip ...

  7. ios蓝牙开发(一)蓝牙相关基础知识

    蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0 ...

  8. The art of multipropcessor programming 读书笔记-硬件基础1

    本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...

  9. [源码解析] 深度学习分布式训练框架 Horovod (1) --- 基础知识

    [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 目录 [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 0x00 摘要 0x01 分布式并 ...

随机推荐

  1. Cesium和Kaarta用高分辨率激光雷达可视化室内和地下环境

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium使急救人员和军事操作人员更容易快速评估和了解密集和不 ...

  2. gin中绑定uri

    package main import ( "github.com/gin-gonic/gin" "net/http" ) type Person struct ...

  3. find直接copy大于某一个时间小于某一个时间的文件

    find ./ -type f -newermt '2000-01-04 10:30:00' ! -newermt '2019-10-28 10:57:00' -exec cp -a {} /var/ ...

  4. 深度评测丨 GaussDB(for Redis) 大 Key 操作的影响

    本文分享自华为云社区<墨天轮评测:GaussDB(for Redis)大Key操作的影响>,作者: 高斯 Redis 官方博客. 在前一篇文章<墨天轮评测:GaussDB(for R ...

  5. 利用 Python 进行数据分析(Python 数据分析)· 第 2 版

    译者:SeanCheney 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 机器学习交流群 629470233 ApacheCN 学习资源 Sklearn 与 ...

  6. 微信小程序--给数组的每个对象添加动画(数据驱动)

    思路:用数据驱动事件,用数组的方式去对循环数组的每个对象进行操作 js代码: data:{ selectCategory: [{ name: '生产模式', content: [{ txt: '原厂' ...

  7. Lua 语言: 语法

    转载请注明来源:https://www.cnblogs.com/hookjc/ -- 两个横线开始单行的注释 --[[  加上两个[和]表示     多行的注释.--]] -------------- ...

  8. js获取 url?后面的参数取值

    function GetRequest() {     var url = location.search; //获取url中"?"符后的字串     var theRequest ...

  9. Nginx网站服务 配置

    Nginx网站服务 配置 1.编译安装Nginx服务 2.认识Nginx服务的主配置文件nginx.conf 3.访问状态统计配置 4.基于授权的访问控制 5.基于客户端的访问控制 6.基于域名的Ng ...

  10. Jenkins敏捷开发 自动化构建工具

    一.序言 Jenkins 是一款自动化构建工具,能够基于 Maven 构建后端 Java 项目,也能够基于 nodejs 构建前端 vue 项目,并且有可视化 web 界面. 所谓自动化构建是按照一定 ...