最近面试的时候被问到指令集,一头雾水,由于之前的工作没有涉及到指令集方面的知识,现总结成文。
定义
指令集架构(英语:Instruction Set Architecture,缩写为ISA),又称指令集或指令集体系,是计算机体系结构中与程序设计有关的部分,包含了
基本数据类型,
指令集,
寄存器,
寻址模式,
存储体系,
中断,
异常处理以及
外部I/O。指令集架构包含一系列的opcode即
操作码(机器语言),以及由
特定处理器执行的
基本命令。(
wiki定义 )
关于指令集的工作方式,知乎上有一个回答我觉得还可以,这里引用一下:
CPU的指令集存放在哪里?
其内容如下:
比如我们设计一套指令集,其中肯定有条加法指令。比如Add R1 R2 。我们可以认为这条指令的意思是计算寄存器R1中的内容和R2的和,然后把结果存到R1寄存器中。
那么经过编译后这条指令会变成二进制,比如010100010010 。这条二进制指令一共12位。明显可以分为三大部分。最前面的0101表示这是条加法指令,后面0001说的是第一个操作数是寄存器1,最后0010说的是第二个数就是寄存器2(其实实际没有这么简单的指令,至少应该区分操作数是寄存器还是直接的数据,但为了把这说的更容易理解作了简化)。我们可以通过十二根导线把这条指令输入一个CPU中。导线通电就是1,不通电就是0 。为了叙述方便我们从左到右用A0-A11给这12根导线编上号。
然后计算机会分析这条指令。步骤如下:
最开始的两根导线A0和A1,第一根有电第二根没电,就能知道这是一条运算指令(而非存储器操作或者跳转等指令)。那么指令将被送入逻辑运算单元(ALU)去进行计算。其实很简单。只要这两根线控制接下来那部分电路开关即可。
接下来的A2和A3,01表示加法,那么就走加法运算那部分电路,关闭减法等运算电路。
A4-A7将被送入寄存器电路,从中读取寄存器保存的值。送到ALU的第一个数据接口电路上。
后面的A8-A11同样被送入寄存器选择电路,接通R2寄存器,然后R2就把值送出来,放到ALU的第二个数据接口上。
ALU开始运算,把两个接口电路上的数据加起来,然后输出。
最后结果又被送回R1。
基本上简单的运算计算机就是这么操作的。他其实不知道你那些指令都是什么意思。具体的指令编程机器码后就会变成数字电路的开关信号。其中某几段会作为控制信号,控制其他部分的数据走不同的电路以执行运算。他没有一个地方保存着如何翻译这些机器码的字典,所有机器码的意义都被体现在整个电路的设计中了。
当然,从汇编到机器码这步是汇编程序翻译的。汇编程序当然知道某条指令要翻译成什么样的机器码。
所以指令集的目的就是为了实现底层操作,为每一种运算,每一种操作(如数据移动)提供相应的寄存器级别的动作,这些寄存器再和最底层的逻辑电路对应,最终完成顶层类似于"int a = 0; a = 1 + 2"的功能。
Reference:
[1]
Wiki:指令集架构
[2]
知乎——CPU的指令集放在哪里?