【硬件基础知识】指令集框架(ISA:Instruction Set Architecture)
阅读原文时间:2023年07月08日阅读:2

定义

指令集架构(英语: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就是这货)。