导言
CPU是怎样运作的?
CPU的运作与人脑的运作差不多。先谈一下人这个体系的工作方法。眼镜、耳朵、舌头、皮肤等等感觉器官接纳到“触觉”,把信息传给大脑,大脑把信息处理后,把处理成果送给手、脚、嘴等履行器官就能够运动了。
人脑的功用便是从某个感觉器官读取信息,处理信息,然后再把成果送给履行器官。
一个完好的体系与人这个体系差不多,传感器接纳数据,再把数据传给CPU(CPU依照必定的时序、协议从内存读数据),CPU读取到数据并处理,把处理成果送给履行机构就行了(实际上CPU便是依照必定时序、协议向内存单元写数据)。
CPU从内存中获取数据,处理数据,再把成果送到内存中去。
一、指令集架构比较
1、X86指令集架构(Register-Memory architecture)
CPU的运算操作数能够悉数都是寄存器,也答应其间的一个操作数在memory中。所以,CPU能够经过其他指令来与memeory交互,这种架构的指令集相对杂乱。举一个比如如下:
add mem,reg
2、ARM指令集架构(Load-Store architecture)
CPU只答应用load/store指令来与memory(Flash、RAM)交互,而CPU的运算悉数都是在寄存器中完结。也便是说,CPU运算的操作数只能悉数来自寄存器,并且结构也只能保存在寄存器中。所以,假使要把RAM两个数据相加,成果还保存到内存中,就需要先将内存中的数据经过load指令将内存数据加载到寄存器中,核算完毕后,再将保存成果寄存器的内容经过store指令存储在RAM中。举一个比如如下:
ADD R0,R1,R2
3、比照剖析
两种架构的差异在于CPU在处理数据时,对内存的拜访实机。
X86能够在处理数据时直接读写内存,可是ARM只能先将内存加载到寄存器才能读,也只要凭借寄存器寻址将运算成果写到内存。
ARM架构这种LOAD/STORE架构要比X86的Register-Memory架构设计时简略的多,成果更简略。
二、指令集比较
阐明:本文的ARM指令集只指ARM指令集,不评论THUMB指令集
1、数据传送指令
指令类功用:担任把数据、地址或当即数传送到寄存器或存储单元中
X86数据传送指令
指令类型 指 令 说 明
通用数据传送指令 MOV(传送)、PUSH(进栈)、POP(出栈)、XCHG(交流)
累加器专用传送指令 IN(输入指令) 、OUT(输入指令)
地址传送指令 LEA(有用地址送寄存器)、LDS(指针送寄存器和DS)、LES(指针送寄存器和ES)
标志寄存器传送指令 LAHF(标志送AH)、SAHF(AH送标志寄存器)、PUSHF(标志进栈)、POPF(标志出栈)
ARM数据传送指令
指令类型 指 令 说 明
通用数据传送指令 LDM(多数据装载)、STM (多数据存储)、LDR(单数据装载)、STR(单数据存储)、 SWP(单一数据交流)
标志寄存器传送指令 MRS(加载标志寄存器到寄存器) MSR(存储寄存器到标志寄存器)
弥补阐明:
<1> LDR/STR指令的地址,必定是(基址寄存器+/-偏移量)构成的
<2> 出栈入栈指令:无专用指令,用LDM、STM指令代替
2、算术指令
指令类功用: 算术运算
X86算术指令
指令类型 指 令 说 明
加法指令 ADD(加法)、ADC(带进位加法)、INC(加1)
减法指令 SUB(减法)、SBB(带借位减法)、DEC(减1)、NEG(求补)、CMP(比较)
乘法指令 MUL(无符号数乘法)、IMUL(带符号数乘法)
除法指令 DIV(无符号数除法)、IDIV(带符号数除法)、CBW(字节转换为字)、CWD(字转换为双字)
ARM算术指令
指令类型指 令 说 明
加法指令 ADC(带进位加法)、ADD(加法)
减法指令 SBC(带借位减法)、SUB(减法)、CMP(比较指令)、RSB(反向减法)、RSC(带借位的反向减法)
乘法指令 MLA(带累加的乘法)、 MUL(乘法)
除法指令没有专用除法指令,需要用函数来完结,通常是把除法转化为乘法来运算
传送类算术指令:MOV(传送到意图寄存器)、MVN(传送到意图寄存器)
弥补阐明:传送类算术指令兼有传送功用和数据运算功用
3、逻辑指令
指令类功用: 对字或字节履行逻辑运算
X86逻辑指令
指令类型 指 令 说 明
逻辑运算指令 AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(异或)、TEST(测验)
移位指令 SHL(逻辑左移)、SAL(算术左移)、SHR(逻辑右移)、SAR(算术右移)、ROL(循环左移)、ROR(循环右移)、RCL(带进位循环左移)、RCR(带进位右移)
ARM逻辑指令
指令类型 指 令 说 明
逻辑运算指令 AND(逻辑与)、 B%&&&&&%(清楚位)、EOR(逻辑异或)、ORR(逻辑或)
移位指令 LSL(逻辑或算术左移)、ASL(逻辑或算术左移)、LSR(逻辑右移)、ASR(算术右移)、 ROR(循环右移)、RRX(带扩展的循环右移)
4、串处理指令
指令类功用:处理寄存存储器里的数据串
X86串处理指令
指令类型 指 令 说 明
指 令 MOVS(串传送)、CMPS(串比较)、SCAS(串扫描)、LODS(从串取)、STOS(存入串)
ARM串处理指令: 无
5、操控搬运指令
指令类功用:用来操控程序的履行流程
X86操控搬运
指令类型 指 令 说 明
无条件搬运指令 JMP(段间和段内搬运)
条件搬运指令 J Z(成果为0(或持平)则搬运)、JS(成果为负则搬运)、JNS(成果为正则搬运)、JO(溢出则搬运)、JNO(不溢出则搬运)、JP(奇偶位为1则搬运)、JNP(奇偶位为0则搬运)
循环指令 LOOP(循环指令)、LOOPPZ/LOOPE(当为0或持平时循环指令)、LOOPNZ/LOOPNE(当不为0或不持平时循环指令)
子程序指令 CALL(调用指令)、RET(回来指令)
中止指令 INT(中止)、INTO(如溢出则中止)、RIET(从中止回来)
ARM操控搬运
指令类型 指 令 说 明
无条件搬运指令 B(跳转)
条件搬运指令 BEQ(持平跳转)、BNE(不等跳转)等等
子程序指令 BL(跳转,并保存下一条指令的地址到LR)、MOV PC,LR(从函数回来)
软中止指令 SWI(软中止)
弥补阐明: ARM指令集没有X86那样专用的循环指令,这些指令都是经过B、BL指令结合其他的指令来完结的
6、相对跳转指令比照
X86相对跳转指令:
jmp short 标号(IP=IP+8位偏移量:-128~127)、
jmp near ptr 标号(IP=IP+16位偏移量:-32768~32767)、
loop(cx=cx-1;if(cx!=0) IP=IP+8位偏移量)
ARM相对跳转指令:
B、
BL
阐明:B、BL指令的偏移量都是24 位有符号数,左移两位后为26位。有符号扩展为 32 位,表明的有用偏移为 26 位(+/-32MB的地址空间)。
7、肯定跳转指令比照
X86肯定跳转指令:
jmp far ptr 标号(CS=标号地点段的段地址;IP=标号地点段的偏移地址)、
jmp word ptr 内存单元(段内搬运)、
jmp dword ptr 内存单元(段间搬运)
ARM肯定跳转指令: 无专用的指令,需要用指令来模仿
<1> “ldr pc, =标号”(相应于B)
<2> ldr lr, =halt_loop(相应于BL)
ldr pc, =标号
halt_loop:
b halt_loop
三、指令集比照总结
1、ARM指令集更简练,比较少
比如说除法指令、循环指令、仓库专用指令等等都是是没有的,靠其他的指令归纳来完结
2、ARM指令集功用更强壮
比如说b指令能够跳转的规模是前后32M
3、ARM每条指令都可条件履行
这使得C言语跳转句子能够用很简洁的方法完结
4、ARM指令集操作更有序
由于是LOAD/STORE结构,所以都是先从内存中加载数据到寄存器(load),然后经过寄存器处理,再把处理成果写到内存中(store)。
5、ARM指令集都是4字节的
这样便于流水线的完结,并且内存的分配更有序。在指令寻址上,也节省了两位地址。