这篇文章来自于农夫山泉,我们是大自然的搬运工,哈哈,文章来源于网络

https://blog.csdn.net/yu132563/article/details/55251534

这个问题包括CPU的硬件结构和汇编语言的范畴. 这里梳理一下.

首先, 题主"李建国"自问自答的部分说的是正确的, CPU的指令集是软件与CPU这两个层级之间的接口, 而CPU自己, 就是对于这一套CPU指令集的"实例化".

无论处于上层的软件多么的高级, 想要在CPU执行, 就必须被翻译成"机器码", 翻译这个工作由编译器来执行. 编译器在这个过程中, 要经过"编译", "汇编", "链接"几个步骤, 最后生成"可执行文件". 可执行文件中保存的是二进制机器码. 这串机器码可以直接被CPU读取和执行.

软件意义上, "指令集"实际上是一个规范, 规范汇编的文件格式.
以下为一条x86汇编代码:
mov word ptr es:[eax + ecx * 8 + 0x11223344], 0x12345678

这里可以体现出指令集的格式限制:
1. 可以使用mov指令, 但它只能有2个操作数.
2. 它的操作数长度是16 (word), 不要看到后面0x12345678就认为是32位操作数.
3. 它带有段超越前缀, 这里使用了es, 还可以使用ds, cs, ss, fs, gs. 但是只能用这几个.
4. 第一个操作数是一个内存地址, 第二个是立即数. 但是, 这个内存地址不能乱写, 写成[eax+ecx*10+0x11223344]就错了.

实际上, 一条汇编指令与一段机器码是一一对应的. 上面这段汇, 可以被x86编译器翻译成几乎唯一的一段机器码:
26 66 c7 84 c8 44 33 22 11 78 56
上面提到的1,2,3,4点如果有一个弄错, 这一步就会失败.

可以看出来, 指令集的作用, 就是告诉程序员/编译器, 汇编一定要有格式. 支持什么指令, 指令带什么限制条件, 用什么操作数, 用什么地址, 都是指令集规范的内容, 要是写错了, 就无法翻译成机器码.
指令集规范汇编, 汇编可以翻译成机器码, 机器码告诉CPU每个周期去做什么. 因此, CPU指令集是描述CPU能实现什么功能的一个集合, 就是描述"CPU能使用哪些机器码"的集合".

那机器码进入到CPU后又做什么呢?
=====================编译器和CPU的分界线========================

需要被执行的机器码先要被OS调度到内存之中, 程序执行时, 机器码依次经过了Memory--Cache--CPU fetch, 进入CPU流水线, 接着就要对它进行译码了, 译码工作生成的象是CPU内部数据格式, 微码(或者类似的格式, 这个格式不同的厂商会自己设计).

这个过程画成图就是:

软件层: 汇编语言
------------------------------------------------------------------------
接口: 汇编语言所对应的机器码
------------------------------------------------------------------------
硬件层: CPU使用内部数据结构进行运算

如果机器码代表的功能是在指令集规范内的, 这条机器码就可以生产微码, 并在CPU内正常流动. 假设机器码是错误的, 是不可以通过CPU的译码阶段的, 控制电路一定会报错. 这种情况反映在Windows里往往都是蓝屏, 因为CPU无法继续执行, 它连下一条指令在哪都不知道.

那么指令集在CPU里就代表: 只有CPU指令集范围内的指令可以被成功的译码, 并送往CPU流水线后端去执行.
和常规的想法不一样, CPU不需要任何形式的存储介质去存储指令集, 因为"译码"这个步骤就是在对指令集里规范的机器码做解码. 硬件上, 译码这件事需要庞大数目的逻辑门阵列来实现.

跳出格式这个圈子来看待这个问题. 可以说, CPU执行单元的能力, 决定了指令集的范围. 比如, CPU的执行单元有能力执行16位加法, 32位加法, 64位加法, 那么指令集里一般就会有ADD 16, ADD 32, ADD 64这样的表达方式. 如果CPU的执行单元没有电路执行AVX指令, 那么指令集里一般就没有VINSERTF128这样的指令供使用. 所以, 强有力的执行单元能够提供更多的指令集.

再来看"CPU指令集在哪里"这个问题, 回答是, CPU本身就是CPU指令集. 指令集规定CPU可以做什么事, CPU就是具体做这件事的工具. 如果一定要指定一个狭义的CPU指令集的存放位置. 那就是CPU中的"译码电路".

=======================================================================================================================
=======================================================================================================================

作者:Cascade
链接:https://www.zhihu.com/question/20793038/answer/16198162
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

是,这个解释起来有点长。Be patient
现代的CPU没拆过,我只在计算机组成原理实验课上用VHDL在某个实验平台上做过一个模拟的CPU。举个例子你可能比较好理解。
比如我们设计一套指令集,其中肯定有条加法指令。比如Add R1 R2 。我们可以认为这条指令的意思是计算寄存器R1中的内容和R2的和,然后把结果存到R1寄存器中。
那么经过编译后这条指令会变成二进制,比如010100010010 。这条二进制指令一共12位。明显可以分为三大部分。最前面的0101表示这是条加法指令,后面0001说的是第一个操作数是寄存器1,最后0010说的是第二个数就是寄存器2(其实实际没有这么简单的指令,至少应该区分操作数是寄存器还是直接的数据,但为了把这说的更容易理解作了简化)。我们可以通过十二根导线把这条指令输入一个CPU中。导线通电就是1,不通电就是0 。为了叙述方便我们从左到右用A0-A11给这12根导线编上号。
然后计算机会分析这条指令。步骤如下:

  1. 最开始的两根导线A0和A1,第一根有电第二根没电,就能知道这是一条运算指令(而非存储器操作或者跳转等指令)。那么指令将被送入逻辑运算单元(ALU)去进行计算。其实很简单。只要这两根线控制接下来那部分电路开关即可。
  2. 接下来的A2和A3,01表示加法,那么就走加法运算那部分电路,关闭减法等运算电路。
  3. A4-A7将被送入寄存器电路,从中读取寄存器保存的值。送到ALU的第一个数据接口电路上。
  4. 后面的A8-A11同样被送入寄存器选择电路,接通R2寄存器,然后R2就把值送出来,放到ALU的第二个数据接口上。
  5. ALU开始运算,把两个接口电路上的数据加起来,然后输出。
  6. 最后结果又被送回R1。

基本上简单的运算计算机就是这么操作的。他其实不知道你那些指令都是什么意思。具体的指令编程机器码后就会变成数字电路的开关信号。其中某几段会作为控制信号,控制其他部分的数据走不同的电路以执行运算。他没有一个地方保存着如何翻译这些机器码的字典,所有机器码的意义都被体现在整个电路的设计中了。
当然,从汇编到机器码这步是汇编程序翻译的。汇编程序当然知道某条指令要翻译成什么样的机器码。

对于第二个例子,其实搞过单片机的人都比较了解了,就是一个GPIO管脚就是一个位操作。对应一个高低电平的输入。

刚才是解释了下什么是指令集,现在再来讨论下指令集大的分类(下面的内容来自百度百科)

微处理器的指令集架构(Instruction Set Architecture)常见种类如下: 复杂指令集运算(Complex Instruction Set Computing,CISC);精简指令集运算(Reduced Instruction Set Computing,RISC) ;显式并行指令集运算(Explicitly Parallel Instruction Computing,EPIC);超长指令字指令集运算(VLIW)

CISC

目前x86架构微处理器如Intel的Pentium/Celeron/Xeon与AMD的Athlon/Duron/Sempron;以及其64位扩展系统的x86-64的架构的EM64T的Pentium/Xeon与AMD64的Athlon 64/Opteron都属于CISC系列。主要针对的操作系统是微软的Windows。另外Linux,一些UNIX等都可以运行在x86(CISC)架构的微处理器。

RISC

RISC这种指令集运算包括HP的PA-RISC,IBM的PowerPC,Compaq(被并入HP)的Alpha,MIPS公司的MIPS,SUN公司的SPARC等。目前只有UNIX,Linux,MacOS等操作系统运行在RISC处理器上。

EPIC

EPIC乃先进的全新指令集运算,只有Intel的IA-64架构的纯64位微处理器的Itanium/Itanium 2。EPIC指令集运算的IA-64架构主要针对的操作系统是微软64位安腾版的Windows XP以及64位安腾版的Windows Server 2003。另外一些64位的Linux,一些64位的UNIX也可以运行IA-64(EPIC)架构。

VLIW

通过将多条指令放入一个指令字,有效的提高了CPU各个计算功能部件的利用效率,提高了程序的性能。

然后具体的指令集,有下面这些

指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序。拥有这些指令集,CPU就可以更高效地运行。Intel主要有x86,EM64T,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4A,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX等指令集。AMD主要是x86,x86-64,3D-Now!指令集。

CPU指令集是什么东西,以及指令集的架构有哪些(有哪些大类),以及具体的指令集都有哪些相关推荐

  1. Battle Encoder Shirase一款能限制进程CPU占有率的小东西

    Battle Encoder Shirase 一款能限制进程CPU占有率的小东西 附件:http://down.51cto.com/data/2348334 本文转自 saturn 51CTO博客,原 ...

  2. 1、有一颗豆跌倒了,它气馁,情绪低落。这豆就是我,有什么能鼓励它站起来呢?答案就是你!因为有一样东西,叫“猪鼓励(朱古力)豆”。   2、你我都是单翼的天...

    1.有一颗豆跌倒了,它气馁,情绪低落.这豆就是我,有什么能鼓励它站起来呢?答案就是你!因为有一样东西,叫"猪鼓励(朱古力)豆". 2.你我都是单翼的天使,只有彼此拥抱才能展翅飞翔. ...

  3. CPU指令集是什么东西

    (已更正) 这个问题包括CPU的硬件结构和汇编语言的范畴. 这里梳理一下. 首先, 题主"李建国"自问自答的部分说的是正确的, CPU的指令集是软件与CPU这两个层级之间的接口, ...

  4. Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)

    架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...

  5. 手机CPU架构体系分类及各大厂商

    手机cpu相关知识,这对于开发Android应用程序适应各个机型有一定的辅助作用 . 手机cpu架构体系分类 指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分,代表架构分别是x86.A ...

  6. intel cpu 漏洞 linux,Intel CPU架构漏洞越捅越大:打补丁将损失30%性能

    还记得前不久那个被曝光影响大面积Intel Core CPU产品的安全漏洞吗?这貌似只是冰山一角,就在今天人们发现了Intel处理器里一个更为致命的漏洞,从最底端的Pentium,到最新的Coffee ...

  7. 整理了4大类22种图表,不用担心用错统计图表,分析不出东西了

    做数据可视化,经常不知道图表要怎么用?做出来的图表又丑又看不出趋势,今天帆软君给大家分享一下如何更好地利用图表. 根据数据之间的关系,统计图表可被分为分成四个大类,你可根据自己的目的(即你想表达什么) ...

  8. Intel现有移动版CPU介绍和性能评价

    字号:大 中 小 双核心系列 X9000>X7900>=T9500>T9300>T7800>T8300>=T7700>T8100>T7600>=T ...

  9. 【嵌入式芯片】GPU,CPU,SOC,DSP,FPGA,ASIC,MCU,MPU,GPP,ECU等简介

    一.各类芯片的定义 CPU: 中央处理器(Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit). 它的功 ...

最新文章

  1. 如何使用包含属性名称的变量检查对象属性是否存在?
  2. C#线程系列讲座(3):线程池和文件下载服务器
  3. source insight 注释乱码?(【File】 > 【Reload As Encoding…】 > 【Chinese Simplified (GB18030)】 > 选择后,点击load)
  4. synaptic不停抖动后自动关闭的问题
  5. 图片优化_Web 性能优化: 图片优化让网站大小减少 62%
  6. 解决关于 ionic3 启动白屏 控制台错误提示:Uncaught SyntaxError Use of const in strict mode.
  7. 关于Android的应用程序的发布的学习(一)
  8. Github访问慢的问题
  9. nfc卡模式与标准模式_NFC相关标准
  10. Word插入页码和目录
  11. 轻量级过程改进之项目计划
  12. 软件测试这个工作入门难不难?
  13. html5 表单 重置,css修改input表单默认样式重置与自定义大全
  14. 代码笔记源码php,读 PHP - Pimple 源码笔记(上)
  15. Python之斐波那契
  16. matlab多重积分编程,多重积分的MATLAB实现.pdf
  17. 如何自己开发一个Android APP(3)——XML和Android
  18. 嵌入式linux开发笔记: gcc选项
  19. PHP 制作微信小程序API 简例
  20. c语言写一个进出货管理,[源码和文档分享]基于C语言实现的超市管理系统

热门文章

  1. 面部识别败给了敌对性攻击?
  2. 变频器MATLAB仿真模型(前端采用二极管整流,含有进线电抗器,预充电模块,母校电容与均压电阻
  3. C语言基础课 编写程序之从键盘输入10个候选人的姓名和得票数,编程实现如下:1.统计总票数2.打印得票数最多的候选人最多的候选人的姓名和得票数3.给定姓名,查询该候选人的得票数4.按得票数从高到低
  4. 如何获得高质量的网站外链
  5. laravel5.5 middleware 多个中间件的写法
  6. caffe2 01 caffe2 win10 vs2017编译(默认CPU版本)
  7. 利用云服务器和frp建立内网映射实现远程桌面和web服务
  8. 【持续集成】CI工具汇总
  9. 编译原理:LL1(1)文法的语法分析器(通过文法构造分析表)
  10. 抢红包算法--四种抢红包算法对比