对指令集的一点理解
2017-07-18 10:28
423 查看
指令集分两种:复杂指令集计算机(Complex Instruction Set Computer CISC)、精简指令集计算机(Reduced Instruction Set Computer RISC)。复杂指令集包含应用程序中不常用的特定指令;而精简指令集只包括程序中常用的指令,特殊操作以子程序的方式实现。
CISC的代表就是X86架构的CPU,RISC的CPU包括:ARM、PowerPC等。
指令集可以理解成一种规范:(汇编 –> 机器码 的这种“翻译规则”) + (CPU执行机器码的逻辑电路) = 指令集。指令集中的每一条指令对应着一条汇编指令和固定的实现电路。芯片内部其实都是电路,指令集只不过是对这些电路的功能进行抽象,然后对上层表现指令。故在同等制造水平上相比较复杂指令集来说,精简指令集可以简化处理器的结构,可以设计功能更复杂的CPU。
例如:
在CISC架构的CPU上,乘法运算指令:MUL ADDRA, ADDRB
这条指令可以将ADDRA和ADDRB中的数相乘并将结果储存在ADDRA中。其中将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作全部依赖于CPU中设计的逻辑来实现。这种架构会增加CPU结构的复杂性和对CPU工艺的要求,但对于编译器的开发十分有利。比如上面的例子,C程序中的a*=b就可以直接编译为一条乘法指令。
RISC架构要求软件来指定各个操作步骤。上面的例子如果要在RISC架构上实现,将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作都必须由软件来实现,即:
MOV A, ADDRA;
MOV B, ADDRB;
MUL A, B;
STR ADDRA, A。
这种架构可以降低CPU的复杂性以及允许在同样的工艺水平下生产出功能更强大的CPU,但对于编译器的设计有更高的要求。
上例转自知乎。
总结:程序语言最后生成机器码的过程(以C为例):C源程序在各个CPU都是兼容的,C语言先经过编译翻译成汇编语言,而汇编语言和CPU就相关了,汇编语言就是由指令集中的指令组成,不同的CPU架构对应的指令集不同,因而编译后的汇编程序就不同。编译这个过程由编译器完成,所以不同的硬件平台编译器有差别,也如上例所说CISC的编译器开发比RISC相对简单一点。汇编语言再经过汇编后编程机器语言,机器语言是CPU可以执行的。简单点说:机器语言其实就是各种0/1信号,它输入到CPU内部的逻辑电路,经过逻辑电路处理后的结果就是输出。所以指令集就是一种规则,把我的CPU硬件基本功能抽象出来成为指令,你高级语言需按照我的规则翻译成对应我这个指令集的汇编语言,汇编语言也要按照我的规则生成机器码。
错误的地方还请大家批评指正
CISC的代表就是X86架构的CPU,RISC的CPU包括:ARM、PowerPC等。
指令集可以理解成一种规范:(汇编 –> 机器码 的这种“翻译规则”) + (CPU执行机器码的逻辑电路) = 指令集。指令集中的每一条指令对应着一条汇编指令和固定的实现电路。芯片内部其实都是电路,指令集只不过是对这些电路的功能进行抽象,然后对上层表现指令。故在同等制造水平上相比较复杂指令集来说,精简指令集可以简化处理器的结构,可以设计功能更复杂的CPU。
例如:
在CISC架构的CPU上,乘法运算指令:MUL ADDRA, ADDRB
这条指令可以将ADDRA和ADDRB中的数相乘并将结果储存在ADDRA中。其中将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作全部依赖于CPU中设计的逻辑来实现。这种架构会增加CPU结构的复杂性和对CPU工艺的要求,但对于编译器的开发十分有利。比如上面的例子,C程序中的a*=b就可以直接编译为一条乘法指令。
RISC架构要求软件来指定各个操作步骤。上面的例子如果要在RISC架构上实现,将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作都必须由软件来实现,即:
MOV A, ADDRA;
MOV B, ADDRB;
MUL A, B;
STR ADDRA, A。
这种架构可以降低CPU的复杂性以及允许在同样的工艺水平下生产出功能更强大的CPU,但对于编译器的设计有更高的要求。
上例转自知乎。
总结:程序语言最后生成机器码的过程(以C为例):C源程序在各个CPU都是兼容的,C语言先经过编译翻译成汇编语言,而汇编语言和CPU就相关了,汇编语言就是由指令集中的指令组成,不同的CPU架构对应的指令集不同,因而编译后的汇编程序就不同。编译这个过程由编译器完成,所以不同的硬件平台编译器有差别,也如上例所说CISC的编译器开发比RISC相对简单一点。汇编语言再经过汇编后编程机器语言,机器语言是CPU可以执行的。简单点说:机器语言其实就是各种0/1信号,它输入到CPU内部的逻辑电路,经过逻辑电路处理后的结果就是输出。所以指令集就是一种规则,把我的CPU硬件基本功能抽象出来成为指令,你高级语言需按照我的规则翻译成对应我这个指令集的汇编语言,汇编语言也要按照我的规则生成机器码。
错误的地方还请大家批评指正
相关文章推荐
- 对MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST)的一点理解
- 对于多表联合查询的一点理解
- 对于anchorPoint的一点理解
- 对/etc/rc.d/init.d目录的一点理解(转)
- 对Struts2的一点理解
- 对于handler的一点理解
- 对BS开发技术发展的一点理解(微软体系)
- 手机中文码制问题的一点理解
- 对I2C总线时序的一点理解以及ACK和NACK(NAK)
- 谈谈对APC的一点理解
- 多态与类型的一点理解
- 对 AbsoluteLayout 的一点理解
- PDO和消息队列的一点个人理解
- 对/etc/rc.d/init.d/目录的一点理解
- Titanium系列--对Window和View的一点理解
- 关于嵌入式软件架构的一点理解
- c/s模式在移动便携系统应用的一点理解
- 关于Provider Bridge的一点理解
- 对动态规划的一点理解 Adjacent Bit Counts
- GIS开发随笔--GIS技术的一点理解和MapNet控件试验