指令框架(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. vs python2.7 bug

    微软vs里面小细节的bug真他妈的多

  2. SpringCloud之使用Zookeeper作为注册中心

    SpringCloud之使用Zookeeper作为注册中心 linux安装zookeeper 安装zookeeper 关闭linux防火墙 启动zookeeper 1 创建项目导入依赖和配置文件 &l ...

  3. gin中绑定表单数据至自定义结构体

    package main import "github.com/gin-gonic/gin" type StructA struct { FieldA string `form:& ...

  4. DNS主从同步部署

    DNS 主从同步原理 主从同步:主每次修改配置文件需要修改一下序列号,主从同步主要 根据序列号的变化. 从DNS:从可以单独修改,主从不会报错.但从修改后,主端同步给从后 从端修改数据会丢失 主从原理 ...

  5. linux 创建用户 用户组,sudo,禁止root远程ssh登录

    创建用户  useradd hanli 为新用户设置密码(在root下可以为普通用户重置密码)  passwd hanli 创建用户组  groupadd  op 将用户添加到用户组  usermod ...

  6. linux文件权限全面解析

    目录 linux文件权限全面解析 一:linux文件的权限有哪些? 1,权限分为3个部分 2,权限位 3,每一个权限拥有一个数字编号 4,在添加权限的时候,可以将权限加起来 5,linux添加权限命令 ...

  7. python列表增加,修改,插入

  8. Python数据结构之“栈”与“队列”

    栈(Stacks): ·定义:是一种只能通过访问其一端来实现的数据存储于检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 ·主要操作: 1. Stack():建立 ...

  9. ApacheCN jQuery 译文集 20211121 更新

    创建 jQueryMobile 移动应用 零.序言 一.jQueryMobile 原型制作 二.jQuery Mobile 网站 三.分析.长表单和前端验证 四.QR 码.地理位置.谷歌地图 API ...

  10. ApacheCN Kali Linux 译文集 20211020 更新

    Kali Linux 秘籍 中文版 第一章 安装和启动Kali 第二章 定制 Kali Linux 第三章 高级测试环境 第四章 信息收集 第五章 漏洞评估 第六章 漏洞利用 第七章 权限提升 第八章 ...