CPU指令集架构基础学习

你说的曾经没有我的故事 提交于 2020-01-14 23:17:51

在最初接触C/C++的时候,我对程序编译后的指令非常着迷,循序渐进的学习了C/C++语言编译器生成汇编语言的模式。

就像是语言翻译一样,我们需要做到直接阅读x86等汇编代码,并且能够将其还原成原始的C/C++语句,这是学习逆向最有效的方法。

CPU是执行程序机器码的硬件单元,相关概念包括以下几项:

**指令码:**是CPU处理的底层命令,典型的底层命令有:将数据在寄存器之间转移,操作内存,计算数值等指令,每一类CPU都有自己的指令集架构,CPU品牌有Intel,AMD,IBM和Cyrix,IDT,VIA威盛,国产龙芯等。

**汇编语言:**为了让程序员少掉头发而创造出来的,是人类可以易于读写。

**CPU寄存器:**每一种CPU都有其固定的通用寄存器(GPR),x86的CPU中有8个GPR,x64里面有16个GPR,ARM中有16个GPR,CPU寄存器就是一种存储单元,他可以无差别存储所有类型的临时变量,如果写一个程序只用到了8个32位变量,CPU自带的寄存器就可以完成任务。

需要一种将高级编程语言转成CPU可以处理的底层机器语言,这种程序就是编译器(Compiler)。

0x01 指令集架构

x86的指令集架构中,opcode(汇编指令对应的机器码)长度是不同的。
ARM属于RISC(精简指令集)架构 CPU,这种指令集在设计之初就力图保持各个opcode长度一致,最初的时候,所有的ARM指令的机器码都被封装到了4个字节中,把这种运行模式叫做ARM模式。

但是在实际应用程序中发现,绝大多数的CPU指令很少用满4个字节,比如MOV/PUSH/CALL/Jcc等,之后又推出了把每条指令分装到2个字节中的Thumb模式的指令集架构,但是Thumb模式又不能封装所有的ARM指令,因此同一程序中可以同时存在ARM模式和Thumb模式两种指令。

之后,ARM的缔造者决定扩充Thumb指令集,在ARMv7平台上开始推出Thumb-2指令集,Thumb-2指令基本都可以分装到2个字节的机器码中,2字节封装不下就用4个字节,现在主流的ipod/iphone程序都使用的是Thumb-2指令集。

之后64位的ARM处理器接踵而至,这种CPU的指令集架构再次使用了固定长度4字节的opcode,哈哈哈哈哈,这样就不会再支持Thumb模式了,这样就有了三种指令集:ARM模式指令集,Thumb模式指令集,ARM64指令集。

0x02 处理器分类

几种常见的CPU架构:

X86
1978年6月8日,Intel发布了史诗级的CPU处理器8086,由此X86架构传奇正式拉开帷幕。首次为8086引入X86作为计算机语言的指令集,定义了一些基本使用规则,X86架构使用的是CISC复杂指令集,同时8086处理器的大获成功也直接让Intel成为了CPU巨头。

ARM(Advanced RISC Machine,进阶精简指令集机器)

ARM可以说是一个异军突起的CPU架构,采用了RISC精简指令集,而且ARM发展到今天,架构上非常灵活,可以根据面向应用场景不同使用不同设计的内核,因此可以广泛用于嵌入式系统中,同时它高度节能的特性,目前各种移动设备中全都是它的身影。据统计,使用ARM架构的芯片年出货量高达200亿片,随着物联网时代降临,对于低功耗性ARM芯片需求量会发生爆炸性增长。

MIPS(Microprocessor without interlockedpipedstages,无内部互锁流水级的微处理器)

在上世纪80年代由美国斯坦福大学Hennessy教授的研究小组研发,它采用精简指令系统计算结构(RISC)来设计芯片。和Intel采用的复杂指令系统计算结构(CISC)相比,RISC具有设计更简单、设计周期更短等优点,并可以应用更多先进的技术,开发更快的下一代处理器。MIPS是出现最早的商业RISC架构芯片之一,新的架构集成了所有原来MIPS指令集,并增加了许多更强大的功能。

PowerPC

PowerPC是有蓝色巨人IBM联合苹果、摩托罗拉公司研发的一种基于RISC精简指令集的CPU,PowerPC架构最大优点是灵活性非常好,核心数目灵活可变,因此在嵌入式设备上具有很高效益,可以针对服务器市场做超多核,针对掌机做双核,因此它具有优异的性能、较低的能量损耗以及较低的散热量。

从上面得知,历史的长河里面,有过许许多多的CPU架构,它们之间的差异性非常大,经过时间、用户的检验,我们平常所接触到CPU架构也就剩X86和ARM两者,按照最核心的不同可以被分为两大类,即“复杂指令集”与“精简指令集”系统,也就是经常看到的“CISC”与“RISC”。

要了解X86和ARM CPU架构,就得先了解CISC复杂指令集和RISC精简指令集 ,因为它们第一个区别就是X86使用了复杂指令集(CISC),而后者使用精简指令集(RISC)。造成他们使用不同该指令集的原因在于,面向的设备、对象、性能要求是不一样。手机SoC普遍都是采用ARM提供的核心作为基础,依据自身需求改变SoC的核心架构,而ARM正正是RISC精简指令集的代表人物。CPU巨头Intel、AMD所采用的X86架构已经沿用了数十年,是CISC复杂指令集的典型代表。

CISC复杂指令系统就是为了增强原有指令的功能,设置更为复杂的新指令实现部分大量重复的软件功能的硬件化。由于早期的电脑主频低、运行速度慢,为了提高运算速度,不得已将更多的复杂指令加入到指令系统中来提高电脑的处理效率,慢慢形成以桌面电脑为首的复杂指令系统计算机。其指令集也是在不断更新增加当中,如Intel为X299平台上的处理器增加了AVX 512指令集,目的就是为了提高某一方面的性能。

虽然CISC可以实现高性能CPU设计,但是设计起来就相当麻烦了,要保持庞大硬件设计正确是一件不容易的事情,还要确保性能有所提升,不能开倒车,因此桌面CPU研发时间也慢慢地变长。这时候,以ARM为首的一些RISC精简指令系统计算机开始崭露头角了。

RISC可以说是从CISC中取其精华去其糟粕,简化指令功能,让指令的平均执行周期减少,达到提升计算机工作主频的目的,同时引入大量通用寄存器减少不必要的读写过程,提高子程序执行速度,这样一来程序运行时间缩短并且减少了寻址,提高了编译效率,最终达到高性能目的。

这两种指令集一直都在求同存异当中,都在追求在体系架构、操作运行、软硬件、编译时间以及运行时间等等诸多因素中做出某种平衡,以此达到当初所设计的高效运转目的。

0x03 总结

CPU品牌有Intel,AMD,IBM和Cyrix,IDT,VIA威盛,国产龙芯。

CPU处理器架构有ARM,x86,x64,MIPS,PowerPC。比如Intel和AMD都是x86架构。

每种CPU处理器都有自己的指令集,因此我们的逆向全栈之路就要学习ARM,x86,x64,MIPS,PowerPC的汇编指令集。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!