奔腾4的CPU扩展指令集是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了奔腾4的CPU扩展指令集是啥相关的知识,希望对你有一定的参考价值。

CPU扩展指令集指的是CPU增加的多媒体或者是3D处理指令,这些扩展指令可以提高CPU处理多媒体和3D图形的能力。著名的有MMX(多媒体扩展指令)、SSE(因特网数据流单指令扩展)和3DNow!指令集。CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。
基本概况
CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)、SEE3和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。通常会把CPU的扩展指令集称为"CPU的指令集"。SSE3指令集也是规模最小的指令集,此前MMX包含有57条命令,SSE包含有50条命令,SSE2包含有144条命令,SSE3包含有13条命令。[1]
编辑本段精简指令集的运用
在最初发明计算机的数十年里,随着计算机功能日趋增大,性能日趋变强,内部元器件也越来越多,指令集日趋复杂,过于冗杂的指令严重的影响了计算机的工作效率。后来经过研究发现,在计算机中,80%程序只用到了20%的指令集,基于这一发现,RISC精简指令集被提了出来,这是计算机系统架构的一次深刻革命。RISC体系结构的基本思路是:抓住CISC指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少指令种类、规范指令格式和简化寻址方式,方便处理器内部的并行处理,提高VLSI器件的使用效率,从而大幅度地提高处理器的性能。
编辑本段相关原理
CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)、SEE3、SEE4和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。我们通常会把CPU的扩展指令集称为”CPU的指令集”。SSE3指令集也是目前规模最小的指令集,此前MMX包含有57条命令,SSE包含有50条命令,SSE2包含有144条命令,SSE3包含有13条命令。目前SSE3也是最先进的指令集,英特尔Prescott处理器已经支持SSE3指令集,AMD会在未来双核心处理器当中加入对SSE3指令集的支持,全美达的处理器也将支持这一指令集。
编辑本段基本分类
从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。通常会把CPU的扩展指令集称为"CPU的指令集"。
编辑本段服务器CPU按指令集分类
CISC指令集
CISC指令集,也称为复杂指令集,英文名是CISC,(Complex Instruction Set Computer的缩写)。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。其实它是英特尔生产的x86系列(也就是IA-32架构)CPU及其兼容CPU,如AMD、VIA的。即使是新起的X86-64(也被成AMD64)都是属于CISC的范畴。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加了X87芯片,以后就将X86指令集和X87指令集统称为X86指令集。 虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到过去的PII至强、PIII至强、Pentium 3,最后到Pentium 4系列、至强(不包括至强Nocona),但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU(如AMD Athlon MP、)都使用X86指令集,所以就形成了庞大的X86系列及兼容CPU阵容。x86CPU目前主要有intel的服务器CPU和AMD的服务器CPU两类。
RISC指令集
RISC是英文“Reduced Instruction Set Computing ” 的缩写,中文意思是“精简指令集”。它是在CISC指令系统基础上发展起来的,有人对CISC机进行测试表明,各种指令的使用频度相当悬殊,最常使用的是一些比较简单的指令,它们仅占指令总数的20%,但在程序中出现的频度却占80%。复杂的指令系统必然增加微处理器的复杂性,使处理器的研制时间长,成本高。并且复杂指令需要复杂的操作,必然会降低计算机的速度。基于上述原因,20世纪80年代RISC型CPU诞生了,相对于CISC型CPU ,RISC型CPU不仅精简了指令系统,还采用了一种叫做“超标量和超流水线结构”,大大增加了并行处理能力。RISC指令集是高性能CPU的发展方向。它与传统的CISC(复杂指令集)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多了。目前在中高档服务器中普遍采用这一指令系统的CPU,特别是高档服务器全都采用RISC指令系统的CPU。RISC指令系统更加适合高档服务器的操作系统UNIX,Linux也属于类似UNIX的操作系统。RISC型CPU与Intel和AMD的CPU在软件和硬件上都不兼容。在中高档服务器中采用RISC指令的CPU主要有以下几类:PowerPC处理器 、SPARC处理器、PA-RISC处理器、MIPS处理器、Alpha处理器。
IA-64
EPIC(Explicitly Parallel Instruction Computers,精确并行指令计算机)是否是RISC和CISC体系的继承者的争论已经有很多,单以EPIC体系来说,它更像Intel的处理器迈向RISC体系的重要步骤。从理论上说,EPIC体系设计的CPU,在相同的主机配置下,处理Windows的应用软件比基于Unix下的应用软件要好得多。 Intel采用EPIC技术的服务器CPU是安腾Itanium(开发代号即Merced)。它是64位处理器,也是IA-64系列中的第一款。微软也已开发了代号为Win64的操作系统,在软件上加以支持。在Intel采用了X86指令集之后,它又转而寻求更先进的64-bit微处理器,Intel这样做的原因是,它们想摆脱容量巨大的x86架构,从而引入精力充沛而又功能强大的指令集,于是采用EPIC指令集的IA-64架构便诞生了。IA-64 在很多方面来说,都比x86有了长足的进步。突破了传统IA32架构的许多限制,在数据的处理能力,系统的稳定性、安全性、可用性、可观理性等方面获得了突破性的提高。 IA-64微处理器最大的缺陷是它们缺乏与x86的兼容,而Intel为了IA-64处理器能够更好地运行两个朝代的软件,它在IA-64处理器上(Itanium、Itanium2 ……)引入了x86-to-IA-64的解码器,这样就能够把x86指令翻译为IA-64指令。这个解码器并不是最有效率的解码器,也不是运行x86代码的最好途径(最好的途径是 直接在x86处理器上运行x86代码),因此Itanium 和Itanium2在运行x86应用程序时候的性能非常糟糕。这也成为X86-64产生的根本原因。
X86-64 (AMD64 / EM64T)
AMD公司设计,可以在同一时间内处理64位的整数运算,并兼容于X86-32架构。其中支持64位逻辑定址,同时提供转换为32位定址选项;但数据操作指令默认为32位和8位,提供转换成64位和16位的选项;支持常规用途寄存器,如果是32位运算操作,就要将结果扩展成完整的64位。这样,指令中有“直接执行”和“转换执行”的区别,其指令字段是8位或32位,可以避免字段过长。 x86-64(也叫AMD64)的产生也并非空穴来风,x86处理器的32bit寻址空间限制在4GB内存,而IA-64的处理器又不能兼容x86。AMD充分考虑顾客的需求,加强x86指令集的功能,使这套指令集可同时支持64位的运算模式,因此AMD把它们的结构称之为x86-64。在技术上AMD在x86-64架构中为了进行64位运算,AMD为其引入了新增了R8-R15通用寄存器作为原有X86处理器寄存器的扩充,但在而在32位环境下并不完全使用到这些寄存器。原来的寄存器诸如EAX、EBX也由32位扩张至64位。在SSE单元中新加入了8个新寄存器以提供对SSE2的支持。寄存器数量的增加将带来性能的提升。与此同时,为了同时支持32和64位代码及寄存器,x86-64架构允许处理器工作在以下两种模式:Long Mode(长模式)和Legacy Mode(遗传模式),Long模式又分为两种子模式(64bit模式和Compatibility mode兼容模式)。该标准已经被引进在AMD服务器处理器中的Opteron处理器。 而推出了支持64位的EM64T技术,再还没被正式命为EM64T之前是IA32E,这是英特尔64位扩展技术的名字,用来区别X86指令集。Intel的EM64T支持64位sub-mode,和AMD的X86-64技术类似,采用64位的线性平面寻址,加入8个新的通用寄存器(GPRs),还增加8个寄存器支持SSE指令。与AMD相类似,Intel的64位技术将兼容IA32和IA32E,只有在运行64位操作系统下的时候,才将会采用IA32E。IA32E将由2个sub-mode组成:64位sub-mode和32位sub-mode,同AMD64一样是向下兼容的。Intel的EM64T将完全兼容AMD的X86-64技术。Nocona处理器已经加入了一些64位技术,Intel的Pentium 4E处理器也支持64位技术。 应该说,这两者都是兼容x86指令集的64位微处理器架构,但EM64T与AMD64还是有一些不一样的地方,AMD64处理器中的NX位在Intel的处理器中将没有提供。[2]
编辑本段扩展指令集
综述
对于CPU来说,在基本功能方面,它们的差别并不太大,基本的指令集也都差不多,但是许多厂家为了提升某一方面性能,又开发了扩展指令集,扩展指令集定义了新的数据和指令,能够大大提高某方面数据处理能力,但必需要有软件支持。
MMX 指令集
MMX发布于1997年,一共57条指令,除了emms、movd和movq这3个指令,其他所有的MMX指令都以字母p开头。MMX指令与FPU(浮点运算器)使用同样的8个通用寄存器,准确说是借用了FPU每个寄存器的前64位,这样MMX指令一次最多可以处理8个字节或者4个字节或者2个双字节或者1个4字节的数据,理论上可以将运算速度最高提高8倍。 MMX与FPU共用寄存器证明了Intel的短视,因为如果FPU要使用寄存器,MMX这时必须暂时退出,等FPU用完之后才能恢复原状。加上早期Intel处理器具有很强的浮点运算能力,游戏开发者都喜欢采用浮点运算,冲突的结果就是MMX的作用大打折扣,甚至有时还会造成性能的瞬间剧降。 Intel没有沿用MMX的称呼,1999年的Pentium Ⅲ处理器上指令集改称SSE。SSE采用了单独的寄存器,解决了与FPU冲突的问题。8个128位单独的SSE寄存器,支持同时处理 4 个单精度浮点数,能够同时处理的数据比64位的MMX翻了一番。SSE一共有70条指令,进一步提升了CPU多媒体处理能力。也从这时开始,SSE的名称固定了下来。MMX指令集Intel代表处理器:Pentium MMX
SSE指令集
SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完全是硬件评论家们和媒体凭感觉和印象对"KNI"的 评价,Intel公司从未正式发布过关于MMX2的消息。 而最终推出的SSE指令集也就是所谓胜出的"互联网SSE"指令集。SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD(单指令多数据技术)浮点运算指令、12条MMX 整数运算增强指令、8条优化内存中连续数据块传输指令。理论上这些指令对目前流行的图像处理、浮点运算、3D运算、视频处理、音频处理等诸多多媒体应用起到全面强化的作用。SSE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。 SSE指令集Intel代表处理器:Pentium III
SSE2指令集
SSE2(Streaming SIMD Extensions 2,Intel官方称为SIMD 流技术扩展 2或数据流单指令多数据扩展指令集 2)指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,这些指令提高了广大应用程序的运行性能。随MMX技术引进的SIMD整数指令从64位扩展到了128 位,使SIMD整数类型操作的有效执行率成倍提高。双倍精度浮点SIMD指令允许以 SIMD格式同时执行两个浮点操作,提供双倍精度操作支持有助于加速内容创建、财务、工程和科学应用。除SSE2指令之外,最初的SSE指令也得到增强,通过支持多种数据类型(例如,双字和四字)的算术运算,支持灵活并且动态范围更广的计算功能。SSE2指令可让软件开发员极其灵活的实施算法,并在运行诸如MPEG-2、MP3、3D图形等之类的软件时增强性能。Intel是从Willamette核心的Pentium 4开始支持SSE2指令集的,而AMD则是从K8架构的SledgeHammer核心的Opteron开始才支持SSE2指令集的。 SSE2指令集Intel代表处理器:老Pentium 4
SSE3指令集
SSE3(Streaming SIMD Extensions 3,Intel官方称为SIMD 流技术扩展 3或数据流单指令多数据扩展指令集 3)指令集是Intel公司在SSE2指令集的基础上发展起来的。相比于SSE2,SSE3在SSE2的基础上又增加了13个额外的SIMD指令。SSE3 中13个新指令的主要目的是改进线程同步和特定应用程序领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、SIMD浮点寄存器操作以及线程同步等五个方面的表现,最终达到提升多媒体和游戏性能的目的。Intel是从Prescott核心的Pentium 4开始支持SSE3指令集的,而AMD则是从2005年下半年Troy核心的Opteron开始才支持SSE3的。但是需要注意的是,AMD所支持的SSE3与Intel的SSE3并不完全相同,主要是删除了针对Intel超线程技术优化的部分指令。 SSE3指令集Intel代表处理器:基于Prescott核心新Pentium 4
3D Now!(3D no waiting)指令集
3DNow!是AMD公司开发的SIMD指令集,可以增强浮点和多媒体运算的速度,并被AMD广泛应用于其K6-2 、K6-3以及Athlon(K7)处理器上。3DNow!指令集技术其实就是21条机器码的扩展指令集。 与Intel公司的MMX技术侧重于整数运算有所不同,3DNow!指令集主要针对三维建模、坐标变换 和效果渲染等三维应用场合,在软件的配合下,可以大幅度提高3D处理性能。后来在Athlon上开发了Enhanced 3DNow!。这些AMD标准的SIMD指令和Intel的SSE具有相同效能。因为受到Intel在商业上以及Pentium III成功的影响,软件在支持SSE上比起3DNow!更为普遍。Enhanced 3DNow!AMD公司继续增加至52个指令,包含了一些SSE码,因而在针对SSE做最佳化的软件中能获得更好的效能。 一个指令,同时处理多个数据的好创意,其他CPU当然也不会放过。AMD看到Intel MMX,眼红之下在K6 CPU里搞出了一个类似的3DNow!因为MMX与浮点数混用时性能会有下降的情况,支持浮点数并行处理的3DNow!找着了机会。其实是AMD占了Intel的便宜,因为很多程序员把3DNow!作为MMX的一个补充,处理整数的时候用MMX,处理浮点数的时候用3DNow!。 1999年的时候,AMD在Athlon处理器上又添加了几个指令,这就是3DNow!+,又被称为3DNow!2。不过看到大势已去,AMD终于放弃了在多媒体指令集上的抵抗,转而支持Intel SSE,这样双方一直到SSE3都相安无事。统一的标准其实是一件好事,要是一个软件分别有SSE版本和3DNow!+版本,开发者和用户很快都会不堪其扰。 但是最近AMD和Intel在多媒体指令集上又开始大打出手,大有分道扬镳的势头。与Intel SSE4.1针锋相对,AMD Phenom只支持SSE4A指令集,并且AMD在去年8月抢先放出了SSE5的风声,而Intel则断然拒绝支持AMD的SSE5,直到现在双方还相持不下。
SSE4指令集
SSE4指令集是Conroe架构所引入的新指令集。这项原本计划应用于NetBurst微架构Tejas核心处理器之上的全新技术也随着它的夭折最终没能实现,这不能不说是个遗憾,但是SSE4指令集出现在了Conroe上又让我们看到了希望。 SSE4指令集共包括16条指令,不过虽然扣肉处理器推出已经有一些时日,但目前英特尔仍没有公布SSE4指令集的具体资料。这相当令人感到纳闷。也许英特尔是基于特殊的考虑,仅让少数合作软件厂商取得数据,只是这种作法实在很没有说服力就是了,天底下没有哪家处理器厂商,希望自己新增的指令越少人用越好。 不过,从Intel Core微架构针对SSE指令所作出的修改被称之为“Intel Advanced Digital Media Boost”技术来看,未来SSE4将更注重针对视频方面的优化,我们认为SSE4主要改进之处可能将针对英特尔的Clear Video高清视频技术及UDI接口规范提供强有力的支持。这两项技术基于965芯片组,Intel的官方把Clear Video技术定义为:支持高级解码、拥有预处理和增强型3D处理能力。 值得一提的是,在SSE4中另一个重要的改进就是提供完整128位宽的SSE执行单元,一个频率周期内可执行一个128位SSE指令。Conroe中SSE的ADDPS(4D 32bit共128bit,单精度加法)、MULPS(4D 32bit共128bit,单精度乘法)和SSE2的ADDPD(2D 64bit共128bit,双精度加法)、MULPD(2D 64bit共128bit,双精度乘法),这四条重要SSE算术指令的吞吐周期都降低到1个周期,真正做到了英特尔宣称的每个周期执行一条128位向量加法指令和一条128位向量乘法指令的能力。 据Intel指出,在应用SSE4指令集后,Penryn增加了2个不同的32Bit向量整数乘法运算支持,引入了8 位无符号 (Unsigned)最小值及最大值运算,以及16Bit 及32Bit 有符号 (Signed) 及无符号运算,并有效地改善编译器效率及提高向量化整数及单精度代码的运算能力。同时,SSE4 改良插入、提取、寻找、离散、跨步负载及存储等动作,令向量运算进一步专门化。 SSE4加入了6条浮点型点积运算指令,支持单精度、双精度浮点运算及浮点产生操作,且IEEE 754指令 (Nearest, -Inf, +Inf, and Truncate) 可立即转换其路径模式,大大减少延误,这些改变将对游戏及 3D 内容制作应用有重要意义。 此外,SSE4加入串流式负载指令,可提高以图形帧缓冲区的读取数据频宽,理论上可获取完整的快取缓存行,即每次读取64Bit而非8Bit,并可保持在临时缓冲区内,让指令最多可带来8倍的读取频宽效能提升,对于视讯处理、成像以及图形处理器与中央处理器之间的共享数据应用,有着明显的效能提升。 据Intel资深工程师兼 Penryn 微架构主管 Stephen Fischer 表示,全新 DivX Alaph 内部测试版本已完全支持SSE4指令集, 1颗 3.33G Hz 的Yorkfield的运算效能,相比上代Intel Core 2 Duo QX6800快约105% ,其中约7成的增益来自SSE4指令集,效果令人满意。
SSSE3指令集
(Supplemental Streaming SIMD Extensions 3)内置于Intel公司微处理器中的多媒体关联的扩张指令集。是扩张了SSE3的产品,于2006年7月首次装载在Core 2 Duo处理器中。 SSE3装载了用一个命令一口气处理复数个数据的「SIMD」的处理方式,特别在处理语音和动画关联上能够高速地发挥力量。SSSE3是在 SSE3命令的基础上又添加了32个新命令的产品,其原名为TNI,是SSE4指令集的子集,包含有13条命令。目前SSSE3也是最先进的指令集,增强了CPU的多媒体、图形图象和Internet等的处理能力。 SSSE3指令集Intel代表处理器:65nm 酷睿2
SSE4.2指令集
在Nehalem架构的Core i7处理器中,SSE4.2指令集被引入,加入了STTNI(字符串文本新指令)和ATA(面向应用的加速器)两大优化指令。SSE4.2新加入的几条新指令有两类。第一类是字符串与文本新指令STTNI,STTNI包含了四条具体的指令。STTNI指令可以对两个16位的数据进行匹配操作,以加速在XML分析方面的性能。据Intel表示,新指令可以在XML分析方面取得3.8倍的性能提升。 第二类指令是面向应用的加速指令ATA。ATA包括冗余校验的CRC32指令、计算源操作数中非0位个数的POPCNT指令,以及对于打包的64位算术运算的SIMD指令。CRC32指令可以取代上层数据协议中经常用到的循环冗余校验,据Intel表示其加速比可以达到6.5~18.6倍;POPCNT用于提高在DNA基因配对、声音识别等包含大数据集中进行模式识别和搜索等操作的应用程序性能。 Intel也公布了支持新指令集的开发工具。这些工具涵盖了主流的编译开发环境。目前已明确支持SSE4.2的开发环境包括:Intel C++ Compiler 10.X、微软的Visual Studio 2008 VC++、GCC 4.3.1、Sun Studio Express等。程序员可以直接使用高级编程语言编程,编译器会自动生成优化结果。当然程序员也可以用内嵌汇编的方式来达到目的。
AMD64位技术
AMD的athlon 64系列处理器的64位技术是在X86指令集的基础上加入了X86-64的64位扩展X86指令集,这就使得athlon 64系列处理器可兼容原来的32位的X86软件,并同时支持X86-64的扩展64位计算,并且具有64位的寻址能力,使得它成为真正的64位X86构架处理器。在采用X86-64架构的Athlon 64处理器中,X86-64指令集中新增了几组处理器寄存器,它能够提供更加快速的执行效率。寄存器是处理器用来创建和储存CPU运算结果和其他运算结果的地方,标准的X86构架中包括8组通用寄存器,而在AMD的X86-64架构中又增加了8组,将通过寄存器的数目提高到了16组。在这基础之上,X86-64指令集还另外增加了8组128位的XMM寄存器,也叫做SSE寄存器。它能够给单指令多数据流技术(SIMD)运算提供更多的存储空间,这些128位的寄存器能够提供在矢量和标量计算模式下进行128位双精度处理,这也为3D数据处理、矢量分析和虚拟技术提供了良好的硬件基础。由于提供了更多的寄存器,按照X86-64标准生产的处理器可以更有效率的处理数据,在一个时钟周期内能够传输更多的信息。
EM64T技术
EM64T(Extended Memory 64 Technology)也就是Intel公司开发的64位内存扩展技术。它实际上就是Intel IA-32构架体系的扩展,既IA-32E(Intel Architectur-32 Extension)。Intel的IA-32处理器通过加入EM64T技术便可在兼容IA-32软件的情况下,允许软件程序利用更多的内存地址空间,并且允许程序进行32 位线性地址写入。Intel的EM64T所强调的是32位技术与64位技术的兼容性,为采用EM64T的处理器增加了8个64位通用寄存器,并将原有的32位通用寄存器全部扩展为64位,这样也提高了处理器的整数运算能力。另外增加的8个SEE寄存器也提供了对SSE、SSE2和SSE3指令的支持。 Intel的主流桌面处理器共有两个模式,传统的IA-32模式和IA-32E模式。在可支持EM64T指令的处理器内有一个扩展功能激活寄存器(Extended Feature Enable Register),称为IA-32_EFER的部件,它控制处理器的EM64T是否被激活。在普通情况下,处理器会作为一颗标准的IA-32处理器,如果在运行64位的软件或程序时,EM64T就会被激活,那么处理器便会在IA-32E扩展模式下运行。
编辑本段指令展望
AMD表示,SSE5指令集的使命之一是增强高性能计算应用,并充分发挥多核心、多媒体的并行优势。SSE5将把以往只存在于高性能特殊架构里的功能引入到x86平台中,以此最大化每条指令的输出能力,并增强代码库。 SSE5是128-bit指令集,一共有170条指令,其中基础指令64条,新增的最重要的有两条: 首先是“三操作数指令”(3-Operand InstrUCtions)。x86指令以往只能处理双操作数,而SSE5会提高到三操作数,达到RISC架构的水平,从而把多个简单的指令集整合到更高效的一个单独指令中,提高执行效率。 然后是“熔合乘法累积”(Fused Multiply Accumulate,FMACxx)。该技术可以把乘法和其他算法结合起来,保证之用一条指令就能完成迭代运算,从而简化代码、提高效率,适用于真实图形着色、快速照相渲染、空间化音频、复向量(矢量)数学等场合。 除此之外还有整数乘法累积指令(IMAC,IMADC)、置换与条件移动指令、向量比较与测试指令、精度控制舍入与变换指令等等。
参考技术A northwood核心奔腾4:MMX,SSE,SSE2
prescott核心奔腾4:MMX,SSE,SSE2,SSE3
参考技术B 我靠,复制 N多 牛逼

ARM体系结构和汇编指令

第一节 可编程器件的编程原理

1. 可编程器件的特点

  • 1 . CPU在固定频率的时钟控制下节奏运行
  • 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行
  • 3 . 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的,本质上是一串由1和0组成的数字。这就是CPU的汇编指令集

2. 从源代码到cpu执行过程

第二节 指令集对cpu的意义

1. 汇编语言与C等高级语言的差异

  • 汇编无移植性,c语言有一定可移植性,jave等更高级的语言移植性更强
  • 汇编语言效率最高,C次之,jave等更高级语言效率更低
  • 汇编不适合完成大型复杂的项目,更高级语言更适合完成更大,更复杂的项目

2. 汇编语言的本质

  • 汇编的实质是机器指令(机器码)的助记符,是一种低级符号语言
  • 机器指令集是一款CPU的编程特征,是这款CPU的设计者制定的。CPU的内部电路设计就是为了实现这些指令集的功能。机器指令集就好像CPU的API接口一样
  • 汇编器的工作是把助记符(如MOV类似人的姓名)翻译成(101001类似身份证号码)

3. 汇编语言的发展过程

  • 纯机器码编码
  • 汇编语言编程
  • c语言编程
  • c++语言编程
  • jave,c#等语言编程
  • 脚本语言编程

4. 总结

  • 汇编语言就是CPU的机器指令集的助记符,是一款CPU的本质特征
  • 不同CPU的机器指令集设计不同,因此汇编程序不能在不同CPU之间相互移植
  • 使用汇编编程可以充分发挥CPU的设计特点,所以汇编编程效率最高,因此在操作系统内核中效率极其重要处都需要用汇编处理

第三节 RISC和CISC的区别

1. CISC

  • complex instruction set computer复杂指令集CPU

  • CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂,工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计

2. RISC

  • Reduced Instruction Set computer精简指令集CPU

  • RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。因此RISC CPU的指令集中只有很少的指令,这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了

3.CPU设计方式发展

  • 早期简单CPU,指令和功能都很有限

  • CISC时代--CPU功能扩展依赖于指令集的扩展,实质是CPU内部组合逻辑电路的扩展

  • RISC年代--CPU仅提供基础功能指令(譬如内存与寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用基础构架来灵活实现

4.RISC与CISC指令数对比

一般典型CISC CPU指令在300条左右
ARM CPU常用指令30条左右

5.发展趋势

没有纯粹的RISC或CISC,发展方向是RISC和CISC结合,形成一种介于2者之间的CPU类型


第四节 统一编址&独立编址&哈佛结构&冯诺伊曼结构

1. 统一编址&独立编址

什么是IO?什么是内存?

  • 内存就是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元

  • IO(input and output)是输入输出接口,是CPU和其他外部设备(如串口,LCD,触摸屏,LED等)之间通信的道路。一般的,IO就是只CPU的各种内部和外部外设

内存的访问方式

  • 内存通过CPU的数据总线来寻址定位,然后通过CPU数据总线来读写

  • CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间

  • 内存与CPU的这种总线式连接方式是一种直接连接,优点是效率高访问块,缺点是资源有限,扩展性差

IO的访问方式(通过访问寄存器来操作IO)

  • IO指的是与CPU连接的各种外设

  • CPU访问各种外设有2种方式,一种是类似于访问内存的方式,即把外设的寄存器当做一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式(RISC,如ARM);另一种是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址(CISC)

内存与IO访问方式的对比

  • 由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高

  • IO与内存统一编址方式,优势是IO当做内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源

  • IO与内存独立编址方式,优势是不占用CPU地址空间;缺点是CPU设计变复杂了

2. 冯诺伊曼结构与哈佛结构

程序和数据

  • 程序运行是两大核心元素:程序代码+数据

  • 程序是我们写好的源代码经过编译,汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会去修改程序,所以程序是只读的

  • 数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是为了改写数据的值

什么是冯诺伊曼结构?什么是哈佛结构?

  • 程序和数据都放在内存中,且不彼此分离的结构称为冯诺伊曼结构,譬如Intel的CPU均采用冯诺伊曼结构

  • 程序和内存分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分单片机(MCS51,ARM9等)均采用哈佛结构

冯诺伊曼结构与哈佛结构对比

  • 冯诺伊曼结构中程序和数据不区分的放在一起,因此安全域稳定性(病毒)是个问题,好处是处理器来简单

  • 哈佛结构中程序(一般放在ROM,flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)

第五节 软件编程控制硬件的关键---寄存器

1. 什么是寄存器

  • 寄存器属于CPU外设的硬件组成部分
  • CPU可以像访问内存一样访问寄存器
  • 寄存器是CPU的硬件设计者制定的,目的是留作外设被编程的"活动开关"
  • 正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器
  • 编程操作寄存器类似于访问内存
  • 寄存器总每个bit位都有特定含义,因此编程操作需要位操作
  • 单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率

2. 两类寄存器

  • SoC中有2类寄存器:通用寄存器(和CPU绑定)和SFR(功能已经在设计CPU时就已经确定好了,不能再改变,已经事先和某个外设绑定好了)
  • 通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与
  • SFR(special function register特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控控制的方法

第六节 ARM体系结构总结

1. ARM是RISC架构

  • [ ] 常用的ARM汇编指令只有二三十条

  • [ ] ARM是低功耗CPU

  • [ ] ARM的架构非常适合单片机,嵌入式,尤其是物联网领域;而服务器等高校性能领域目前主导还是Intel

2. ARM是统一编址的(IO与内存)

  • [ ] 大部分ARM(M3 M4 M7 M0 ARM9 ARM11 A8 A9等)都是32位架构

  • [ ] 32位ARM CPU支持的内存少于4G,通过CPU地址总线来访问

  • [ ] SoC中的各种内部外设通过各自的SFR编程访问,这些SFR的访问方式类似于访问普通内存,这叫IO与内存统一编址

3. ARM是哈佛结构的

  1. 常见的ARM(ARM7除外(已淘汰))都是哈佛结构的

  2. 哈佛结构保证了ARM CPU运行的稳定性和安全性,因此ARM适用于嵌入式领域

  3. 哈佛结构也决定了ARM裸机程序(使用实地址即物理地址的地址叫裸机程序)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多


第七节 S5PV210的地址映射详解

1. 什么是地址映射(一般叫内存映射)

  • S5PV210属于ARM Cortex-A8架构,32位CPU,CPU设计时就有32根地址线&32根数据线

  • 32根地址线决定了CPU的地址空间为4G,那么这4G空间如何分配使用?这个问题就是地址映射问题(硬编码,不能修改)

2. 一些专用术语

  • ROM:read only memory 只读存储器(不能直接通过地址总线和数据总线写)
  • RAM:ramdom access memory 随机访问存储器
  • IROM:internal rom 内部ROM,指的是集成到SoC内部的ROM(内存条有两个IROM&IRAM,目的是映射和转换。底下是上面的映射,很灵活)
  • IRAM:internal ram 内部RAM,指的是集成到SoC内部的RAM
  • DRAM:dynamic ram 动态RAM(外部接的内存就是平时我们插入的内存条)
  • SRAM:static ram 静态RAM,容量小,价格高,优点是不需要软件初始化直接上电就能用
  • SROM:接网卡

第八节 CPU和外部存储器的接口

1.内存与外存的区别

  • 内存就是内部存储器,是用来运行程序的,即RAMDRAM,SRAM,DDR),通过地址总线访问

  • 外存就是外部存储器,是用来存储东西的,即ROM(硬盘,flash(Nand,iNand...U盘,SSD),光盘)

  • CPU连接内存和外存的连接方式不同。内存需要直接地址访问,所以是通过地址总线和数据总线的总线式访问方式连接到(好处是直接访问,随机访问;坏处是占用CPU的地址空间,大小受限);外存是通过CPU的外存接口来连接到(好处是不占用CPU的地址空间,坏处是访问速度没有总线式快,访问时序较复杂)

2. SoC常用外部存储器

Flash类(电子式)

  • NorFlash(总线式访问,接到SROMC Bank,优点是可以直接总线访问,一般用来启动,太贵,已很少使用,但很可靠)
  • NandFlash(分为SLC和MLC,已渐渐淘汰)
  • eMMC/iNand/moviNand(iNand是SanDisk公司出厂的eMMC,moviNand是三星出厂的eMMC)
  • oneNAND(oneNand是三星出的一种Nand,只有三星使用)
  • eSSD(e即embeded嵌入式)
  • SD卡/TF卡/MMC卡

硬盘类

SATA硬盘(机械式访问,磁存储原理,SATA是接口)

3. X210开发板支持的外部存储器

  • X210有2个版本,Nand版和iNand版,分别使用NandFlash和iNand位外部存储器。我们使用的是iNand版本,板载4GBiNand

  • S5PV210共支持4个SD/MMC通道,其中通道0和2依次用作启动。X210开发板中SD/MMC0通道用于连接板载MMC,因此外部启动时SD/MMC2通道(注意通道3不能启动)

第九节 S5PV210的启动过程详解

1. S5PV210 的启动过程

第一步:CPU上电后先从内部iROM中读取预先设置的代码,执行。这一段iROM代码做了一些基本的初始化(CPU时钟,关看门狗...)(这一段iROM代码是三星出厂前设置的,三星不知道我们板子上将来接的是什么样的DRAM,因此这一段iROM是不能负责初始化外接的DRAM,因此这一段代码只能初始化SoC内部的东西);然后这一段代码会判断我们选择的启动模式(我们通过硬件跳线可以更改板子的启动模式),然后从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到内部SRAM

第二步:从SRAM去运行上一步读取来的BL1(16KB),然后执行。BL1负责初始化NandFlash,然后将BL2读取到iRAM(80KB).

第三步:从iRAM运行BL2,BL2初始化DRAM,然后将OS读取到DRAM中,然后启动OS,启动过程结束

思路:因为启动代码的大小是不定的,所以两步启动不合适
三星的解决方案是:把启动代码分为2半(BL1和BL2),这两部分协同工作来完成启动

2. BL0(iROM)做了什么

  • 关看门狗
  • 初始化指令cache
  • 初始化栈
  • 初始化堆
  • 初始化块设备复制函数device copy function
  • 设置SoC时钟系统
  • 复制BL1到内部的iRAM(16KB)
  • 检查BL1的校验和
  • 跳转到BL1去执行

3. S5PV210的所有启动

  • 先1st,通过OMpin选择启动介质
  • 再2nd启动,从SD2
  • 再Uart启动
  • 再USB启动

4. 其他

  1. 内存:

     SRAM:静态内存,特点是容量小,价格高,优点是不需要软件初始化直接上电就能用
     DRAM:动态内存,特点是容量大,价格低,缺点是上电后不能直接使用,需要软件初始化后才可以使用

单片机中:内存需求量小,而且希望开发尽量简单,适合全部用SRAM
嵌入式系统:内存需求量大,而且没有NorFlash等可启动介质
PC机中:内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部用DRAM

2 . 外存:

NorFlash:特点是容量小,价格低,优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般用启动介质
NandFlash(跟硬盘一样):特点是容量大,价格低,缺点是不能总线式访问,也就是说不能上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写

所以一般PC机都是:很少容量的BIOS(NorFlash) + 很大容量的硬盘(类似NandFlash) + 大容量的DRAM
一般的单片机:很少容量的NorFlash + 很少容量的SRAM
嵌入式系统:因为NorFlash很贵,现在很多嵌入式系统倾向于不同NorFlash,直接用:外接的大容量Nand + 外接大容量DRAM + SoC内置SRAM

3 . S5PV210启动方式是:外接的大容量Nand + 外接大容量DRAM + SoC内置SRAM
实际上,210内置了一块96KB的SRAM(叫iRAM),同时还有一块内置的64KB大小的NorFlash

第十节 如何在开发板上选择不同的启动方式

  1. 体验从SD0的eMMC启动
    开发板默认从eMMC启动,内部预先烧录了Android

  2. 从SD2启动
    可以使用外置SD卡从SD2通道启动,但这需要先破坏板载的eMMC中的android镜像。破坏方法见《X210V3开发板立即教程》2.5.2节

  3. USB调试模式

第十一节 ARM的编程模式和7种工作模式

1. ARM的基本设定

  1. ARM采用的是32位架构
  2. ARM约定:

     Byte: 8 bits
     Halfword:16 bits (2 byte)
     Word: 32 bits (4 byte)
  3. 大部分ARM core提供

     ARM指令集(32 bit)
     Thumb指令集(16 bit)
     Thumb2指令集(16 & 32 bit)

4.Jazelle cores 支持 jave bytecode

2. ARM处理器工作模式

  1. ARM处理器共有7种基本工作模式

     用户模式
     User:非特权模式,大部分任务执行在这种模式
    
     异常模式
     FIQ:当一个高优先级(fast)中断产生时将会进入这种模式
     IRQ:当一个低优先级(normal)中断产生是将会进入这种模式
     Supervisor(管理模式):当复位或软中断指令执行时将会进入这种模式
     Abort:当存取异常时将会进入这种模式
     Undef:当执行未定义指令时将会进入这种模式
    
     系统模式
     System:使用和User模式相同寄存器集的特权模式

注意:

  1. 除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)
  2. Privilege中除sys模式外,其余5种为异常模式
  3. 各种模式的切换,可以是程序员通过代码主动切换(通过写CPSP寄存器);也可以是CPU在某些情况下自动切换
  4. 各种模式下权限和可以访问的寄存器不同

2. CPU为什么设计这些模式

  1. CPU是硬件,OS是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性
  2. 操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要

第十二节 ARM的37个寄存器(不是SFG)详解

1. 概述

ARM总共有37个寄存器,但是每种模式下最多只能看到18个寄存器,其他寄存器虽然名字相同但是在当前模式下不可见。

37个寄存器中30个为"通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5中异常模式下的SPSR

对r14这个名字来说,在ARM中共有6个名叫r14(又叫sp)的寄存器,但是在每种特定处理器模式下,只有一个r14是当前可见的,其他的r14必须切换到它的对应模式下才能看到。这种设计叫影子寄存器(banked register)

2. CPSR程序状态寄存器

  1. Mode位(0 - 4)

     处理器模式位
  2. T Bit(5)

     仅ARM xT架构支持
     T = 0:处理器处于ARM状态
     T = 1:处理器处于Thumb状态
  3. 中断禁止位(6 - 7)

     I = 1:禁止IRQ
     F = 1:禁止FIQ
  4. J位(24)

     仅ARM 5TE/J架构支持
     J = 1:处理器处于Jazelle状态
  5. Q位(27)

     仅ARM 5TE/J架构支持
     指示饱和状态
  6. 条件位(28 - 31)

     N = Negative result from ALU
     Z = Zero result from ALU
     C = ALU operation Carried out
     V = ALU operation overflowed

3. PC(r15)程序控制寄存器

  1. PC(Program control register)为程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转是就是把目标地址代码放到PC中)
  2. 整个CPU中只有一个PC(CPSR也只有一个,但SPSR有5个)

第十二节 ARM的异常处理方式简单介绍

1. 什么是异常

  1. 正常工作之外的流程都叫异常

  2. 异常会打断正在执行的工作,并且一般我慢希望异常处理完成后继续回来执行原来的工作

  3. 中断是异常的一种

2. 异常向量表

  1. 所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的

  2. 当异常发生时,CPU会自动动作(PC跳转到宜昌向量处处理异常,有时伴有一些辅助动作)

  3. 异常向量表是应将想软件提供的处理异常的支持

3. ARM的异常处理机制

  1. 当异常产生时

     拷贝CPSR到SPSR_<mode>
     设置适当的CPSR位:
         改变处理器状态进入ARM态
         改变处理器模式进入相应的异常模式
         设置中断禁止位禁止相应中断
     保存返回地址到LR_<mode>
     设置PC为相应的异常向量
  2. 返回时,异常处理需要

     从SPSR_<mode>恢复CPSR
     从LR_<mode>恢复PC
     Note:这些操作只能在ARM态执行

第十三节 ARM的汇编指令集

1. 指令与伪指令的概念

  1. (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行

  2. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),他是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码

2. 两种不同风格的ARM指令

  1. ARM官方的ARM汇编风格:指令一般用大写,Windows中IDE开发环境(如ADS,MDK等)常用。如:LDR R0,[R1]

  2. GNU风格的ARM汇编:指令一般用小写字母,linux中常用。如ldr r0,[r1]

3. ARM汇编的特点

LDR/STR架构

  1. ARM采用RISC架构,CPU本身不能直接读取内存,而需要先讲内存中的内容加载入CPU中通用寄存器中才能被CPU处理

  2. ldr(load register)指令将内存内容加载入通用寄存器

  3. str(store register)指令将寄存器内容存入内存空间中

  4. ldr/str组合用来实现ARM CPU和内存数据交换

8种寻址方式

    > * 寄存器寻址 mov r1,r2
    > * 立即寻址 mov r0,#0xFF00
    > * 寄存器移位寻址 mov r0,r1,lsl #3
    > * 寄存器间接寻址 ldr r1,[r2]
    > * 基址变址寻址 ldr r1,[r2,#4]
    > * 多寄存器寻址 ldmia r1!,{r2-r7,r12}
    > * 堆栈寻址 stmfd sp!,{r2-r7,lr}
    
    > * 相对寻址 beq flag
    

指令后缀

同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有

    > * B(Byte) 功能不变,操作长度变为8位
    > * H(Half word) 功能不变,长度变为16位
    > * S(Signed) 功能不变,操作数变为有符号
    > * 如ldr ldrb ldrh ldrsb ldrsh
    > * S(S标志) 功能不变,影响CPSR标志位
    > * 如mov movs
    

条件执行后缀

条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果
条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行

moveq r0,r1  @类似于c语言中的if (eq) {r0= r1;}
操作码条件码助记符标志含义
0000 EQ Z = 1 相等
0001 NE Z = 0 不相等
0010 CS/HS C = 1 无符号数大于或等于
0011 CC/LO C = 0 无符号数小于
0100 MI N = 1 负数
0101 Pl N = 0 正数或零
0110 VS V = 1 溢出
0111 VC V = 0 没有溢出
1000 HI C = 1,Z = 0 无符号数大于
1001 LS C = 0,Z = 1 无符号数小于或等于
1010 GE N = V 有符号数大于或等于
1011 LT N != V 有符号数小于
1100 GT Z = 0,N = V 有符号数大于
1101 LE Z = 1,N != V 有符号数小于或等于
1110 AL 任意 无条件执行(指令默认条件)
1111 NV 任意 从不执行(不要使用)

多级指令流水线

为了增加处理器指令流的速度,ARM使用多级流水线, S5PV210使用13级流水线,ARM11为8级

允许多个操作同时处理,而非顺序执行

PC指向正被取值的指令,而非正在指向的指令

4. 常用的ARM指令

数据处理指令

数据传输指令 mov mvn
算术指令 add sub rsb adc sbc rsc
逻辑指令 and orr eor bic
比较指令 cmp cmn tst teq
乘法指令 mvl mla umull umlal smull smlal
前导零计数 clz

注意
1 . mvn和mov用法一样,区别是mov是原封不动的传递,而mvn是按位取反后传递

mov r1,r2  @两个寄存器之间数据传递
mov r1,#0  @将立即数传给寄存器

2 . and orr(逻辑或) eor(逻辑异或) bic(位清除指令)

bic r0,r0,#0x1f @将r0中的数的bit0到bit4清零后赋值给r0    0x1f = 0x0000 001f = 0x0000 ```` 11111

3 . 比较指令用来不叫2个寄存器中的数

cmp r0,r1 @比较r0,r1的数是否相等
cmn r0,r1 @让r0和r1中的数相加
tst r0,#0xf @测试r0的bit0-bit3是否相等

注意:比较指令不用后加s后缀就可以影响spcr中的标志位

4 . sub r2,r0,r1 (r2 = r0 -r1)

cpsr访问指令

CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr

mrs & msr(更强)

mrs用来读psr,msr用来写psr

注意cpsr和spsr的区别和联系:
cpsr是程序状态寄存器,整个SoC中只有1个;而spsr有5个,分别在5中异常模式下,作用是当从普通模式进入一场模式时,用来保存之前普通模式下的cpsr,以在返回普通模式时恢复原来的cpsr

跳转(分支)指令

b & bl & bx

b 直接跳转
bl branch and link,跳转前把返回地址放入lr中,以便返回,以便于函数调用
bx 跳转同时切换到ARM模式,一般用于异常处理的跳转(现在已经不用)

访存指令

ldr/str & ldm/stm &swp

单个字/半字/字节访问ldr/str
多字批量访问 ldm/stm
swp r1,r2,[r0] @内存与寄存器交换内容
swp r1,r1,[r0]

软中断指令

    swi(software interrupt)
    

软中断指令用来实现操作系统中系统调用

5. ARM汇编中的立即数(标志符号#)

  1. 合法立即数和非法立即数

  2. ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法与非法之分

  3. 合法立即数:经过任意位数的移位后非零部分可以用8位表示的几位合法立即数

     合法:0xf000 000f,0x00ff 0000

6. ARM的协处理器指令

什么是协处理器

  • SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务

  • ARM设计上支持多达16个协处理器,但是一般SoC只实现其中的CP15(coprocessor)

  • 协处理器和MMU,cache,TLB等处理有关,功能上和操作系统1的虚拟地址映射,cache管理等有关

协处理器cp15操作指令

    mcr & mrc
    

mrc用于读取cp15中的寄存器
mcr用于写入cp15中的寄存器

MRC & MCR的使用方法

  • [ ] mcr{
  • [ ] opcode_1:对于cp15永远为0
  • [ ] Rd:ARM的普通寄存器
  • [ ] Crn:cp15的寄存器,合法值是c0-c15
  • [ ] Crm:cp15的寄存器,一般均设为c0
  • [ ] opcode_2:一般省略或为0

7.ARM的ldm/stm与栈处理

为什么需要多寄存器访问指令

  • ldr/str每周期只能访问4字节内存,如果需要批量读取,写入内存时太慢,解决方案是ldm/stm
  • ldm/stm:load register multiple/store register multiple
  • 举例(uboot的start.S 537行)

      stmia sp,{r0-r12}
      @将r0存入sp指向的内存处(假设为0x3000 1000);然后地址+4(即指向0x3000 1004),将r1存入该地址;然后地址再+4(指向0x3000 1008),将r2存入该地址.....直到r12内容放入(0x300 1030),指令完成
      一个存访周期同时完成13个寄存器的读写
      (r0-r12寄存器,sp寄存器里放了一个内存)

8种后缀

  • ia(increase after)先传输,再地址+4
  • ib(increase brfore)先地址+4,再传输
  • da(decrease after)先传输,再地址-4
  • db
  • fd(full decrease)满递减堆栈
  • ed(empty decrease)空递减堆栈
  • fa 满递增堆栈
  • ea 空递增堆栈

4种栈

  • 空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出
  • 满栈:栈指针指向栈中最后一个数据,每次存入时需要先移动栈指针一格再存入
  • 增栈:栈指针移动时向地址增加的方向移动的栈
  • 减栈:栈指针移动时向地址减少的方向移动的栈

!的作用

    ldmia r0,{r2 - r3}
    ldmia r0 !,{r2 - r3}

!作用是r0的值在ldm过程中发生的增加或者减少最后写回r0的值

^的作用

    ldmfd sp!,{r0 - r6,pc}
    ldmfd sp!,{r0 - r6,pc}^
    

^的作用:在目标寄存器中有PC时,会同时将spsr写入到cpsr,一般用于从异常模式返回

8. 总结

操作栈时使用相同的后缀就不会出错
批量读取或写入内存时要用ldm/stm指令
常用stmfd和stmia

第十四节 ARM汇编伪指令

1. 伪指令的意义

  • 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码
  • 伪指令的意义在于指导编译过程
  • 伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令

2. gnu汇编中的一些符号

  • [ ] @用来做注释。可以在行首也可以在代码后面同一行直接跟,和c语言中的//类似
  • [ ] # 做注释,一般放在行首,表示这一行都是注释而不是代码
  • [ ] :以冒号结尾的是标号
  • [ ] .点号在gnu汇编中表示当前指令的地址
  • [ ] #立即数前面要加#或$,表示这个数是立即数

3. 常用gnu伪指令

  • [x] .global_start @给_start外部链接属性
  • [x] .section.text @指定当前段为代码段
  • [x] .ascii.byte.short.long.word @定义变量(数据类型)
  • [x] .quad.float.string @定义数据(与上一致·不常用)
  • [x] .align 4 @以16字节对齐(2^4)
  • [x] .balignl 16 0xabcdefgh @16字节对齐填充(b表示位填充;align表示对齐;l表示long,以4字节为单位填充;16表示16字节对齐,0xabcdefgh是用来填充的原料)
  • [x] .equ @类似c语言中的宏定义

4. 偶尔会用到的gnu伪指令

  • [ ] .end @标志文件结束
  • [ ] .include @头文件包含
  • [ ] .arm/.code32 @声明以下为arm指令
  • [ ] .thumb/.code16 @声明以下为thubm指令

5. 最重要的几个伪指令

  • [x] ldr @大范围的地址加载指令
  • [x] adr @小范围的地址加载指令
  • [x] adrl @中等范围的地址加载指令
  • [x] nop @空操作

ARM中有一个ldr指令,还有一个ldr伪指令

    ldr指令:ldr r0,#0xff
    ldr伪指令:ldr r0,=0xfff1
    @涉及到合法/非法立即数,涉及到ARM文字池
    

一般都使用ldr伪指令而不用ldr指令

adr和ldr的区别

  • adr编译时会被一条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池的方式处理
  • adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里
  • ldr加载的地址和连接式给定的地址有关,由链接脚本决定

adr和ldr的差别:ldr加载的地址在连接时确定,而adr加载的地址在运行是确定;所以我们可以通过adr和lar加载的地址比较来判断当前程序是否在链接时指定的地址运行(重定位)

注:参考朱老师物联网大讲堂

以上是关于奔腾4的CPU扩展指令集是啥的主要内容,如果未能解决你的问题,请参考以下文章

AVX指令集是什么?(Advanced Vector Extensions 高级向量扩展)

AVX指令集是什么?(Advanced Vector Extensions 高级向量扩展)

指令集的概念

CPU的指令集主要都有哪些

SSE、SSE2、SSE3指令集的区别?

如何分享安卓修改手机CPU指令集