指令集

Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64

寵の児 提交于 2019-11-30 15:15:10
一、概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386). 在模拟器上编译报错:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 armv6). 要解决以上问题,就要了解一下Apple移动设备处理器指令集相关的一些细节知识。 二、几个重要概念 1、ARM ARM处理器,特点是体积小、低功耗、低成本、高性能,所以几乎所有手机处理器都基于ARM,在嵌入式系统中应用广泛。 2、ARM处理器指令集 armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。 还有两个我们也很熟悉的指令集:i386|x86_64 是Mac处理器的指令集,i386是针对intel通用微处理器32架构的。x86_64是针对x86架构的64位处理器

Apple移动设备默认指令集

喜夏-厌秋 提交于 2019-11-30 15:14:54
armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch armv7 设备: iPhone3GS, iPhone4, iPhone4S iPad, iPad2, iPad3(The New iPad), iPad mini iPod Touch 3G, iPod Touch4 armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display) arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display) XCode中与指令集相关的选项 (Build Settings 面板下 Architectures): Architectures: 指明选定Target要求被编译生成的二进制包所支持的指令集支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,从而会造成最终编译生成的包很大。 Valid Architectures: 指明可能支持的指令集并非Architectures列表中指明的指令集都会被支持,Valid Architectures限制可能被支持的指令集的范围,即Valid

干翻线段树——指令集优化指北

余生长醉 提交于 2019-11-29 13:18:55
前言 在我们刷题的时候,总会碰到一些关于 区间操作/修改 的题目。这些题目往往要求我们维护一段区间,支持对一段区间进行查询/修改操作。这些题目有如 树状数组1 一般的 简单题 ,也有如[无聊的数列][2]一般,线段树、树状数组能够完成,但是码量长,可读性差,思考难度大的 较难题 。这种题目对时间的要求非常严格, 询问/查询次数 与 序列长度 均在 \(10^5\) 级别或以上,能够使 \(O(n^2)\) 的暴力算法望屋窃叹。那么,有没有什么方法,可以通过数据,代码又易于实现呢? 指令集优化 今天我要讲的 指令集优化 ,就是对这个问题的最佳解答。那么,什么是指令集?指令集优化又能干什么? 什么是指令集? 指令集是存储在CPU内部,对CPU运算进行指导和优化的指令集合。 简单来说,我们写的程序,无论是C, C++, Java, Python,还是其它高级语言,CPU都是看不懂的。这个时候,我们的编译器(解释器)把这些语言翻译为汇编代码,进而翻译01编码,即CPU能看得懂的 指令集命令 。 但是,由于高级语言的特性,在向下翻译的过程中,为了保证其 正确性 与 兼容性 ,编译器会产生大量冗余代码。这些代码的存在使程序运行的速度变得慢了许多。 那我能不能把那些冗余代码删掉啊? 通常情况下,这些冗余代码是不能完全弄掉的。比较特殊的方法是开启编译器优化,也就是我们常说的 吸氧(-o2),吸臭氧

ARM汇编指令集

亡梦爱人 提交于 2019-11-29 12:19:22
跳转指令 B BL会把当前PC指针的值加4保存到R14里。 MOV{条件}{S} 目的寄存器 ,源操作数 只能用在通用寄存器的操作 MOV R1,R0 将寄存器R0的值传送到R1里 MVN{条件}{S} 目的寄存器 ,源操作数 在传送之前按位取反,即把一个被取反的值传送到目的 寄存器中。 S决定指令操作是否影响CPSR中条件标志位的值,没有S 时指令不更新CPSR中条件标志位的值。 CMP{条件}操作数1,操作数2 把两个操作数进行比较,同时更新CPSR中条件标志位的值 该指令进行一次减法运算,不存储结果,只更改条件标志位 TST{条件 }操作数1,操作数2 把一个寄存器的内容和另一个寄存器的内存或立即数进行按位与运算,并 更新CPSR中条件标志位的值,当位与结果为0时,EQ位被设置。 TST R5,#(1<<23) ;当bit23位为1时,CPSR EQ位被设置 ADD{条件}{S}目的寄存器,操作数1,操作数2 将两个操作数相加,把结果放在目的寄存器中。 ;ADD指令 MOV R1,#1 MOV R2,#2 MOV R3,#3 ADD R0,R1,R2 ;R0=R1+R2 ADD R0,R1,#256 ;R0=R1+256 ADD R0,R2,R3,LSL#1 ;R0=R2+(R3<<1) SUB{条件}{S}目的寄存器,操作数1,操作数2 用操作数1减操作数2

RV32FDQ/RV64RDQ指令集(2)

落花浮王杯 提交于 2019-11-28 12:52:38
下面我们逐个看下每个指令的细节: fadd.s fadd.s rd, rs1, rs2 //f [rd] = f [rs1] + f [rs2] 单精度浮点加(Floating-point Add, Single-Precision). R-type, RV32F and RV64F. 把寄存器 f[rs1]和 f[rs2]中的单精度浮点数相加,并将舍入后的和写入 f[rd]。 示例: to do fsub.s fsub.s rd, rs1, rs2 //f[rd] = f[rs1] - f[rs2] 单精度浮点减(Floating-point Subtract, Single-Precision). R-type, RV32F and RV64F. 把寄存器 f[rs1]和 f[rs2]中的单精度浮点数相减,并将舍入后的差写入 f[rd]。 示例: to do fmul.s fmul.s rd, rs1, rs2 //f[rd] = f[rs1] × f[rs2] 单精度浮点乘(Floating-point Multiply, Single-Precision). R-type, RV32F and RV64F. 把寄存器 f[rs1]和 f[rs2]中的单精度浮点数相乘,将舍入后的单精度结果写入 f[rd]中。 示例: to do fdiv.s fdiv.s rd, rs1,

字节码解释执行引擎

主宰稳场 提交于 2019-11-28 10:49:40
虚拟机是如何执行方法中的字节码指令的。许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,在解释执行时,虚拟机执行引擎是如何工作的。 解释执行 不论是解释还是编译,也不论是物理机还是虚拟机,对于应用程序,机器都不可能如人那样阅读、理解,然后就获得了执行能力。大部分的程序代码到物理机的目标代码或虚拟机能执行的指令集之前,都需要经过图中的各个步骤。很容易就会发现图中下面那条分支,就是传统编译原理中程序代码到目标机器代码的生成过程,而中间的那条分支,自然就是解释执行的过程。如今,基于物理机、Java虚拟机,或者非Java的其他高级语言虚拟机(HLLVM)的语言,大多都会遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法分析和语法分析处理,把源码转化为抽象语法树(Abstract Syntax Tree,AST)。对于一门具体语言的实现来说,词法分析、语法分析以至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是C/C++语言。也可以选择把其中一部分步骤(如生成抽象语法树之前的步骤)实现为一个半独立的编译器,这类代表是Java语言。又或者把这些步骤和执行引擎全部集中封装在一个封闭的黑匣子之中,如大多数的JavaScript执行器。

JVM(十二):方法调用

早过忘川 提交于 2019-11-28 10:34:25
JVM(十二):方法调用 在 JVM(七):JVM内存结构 中,我们说到了方法执行在何种内存结构上执行:Java 方法活动在虚拟机栈中的栈帧上,栈帧的具体结构在内存结构中已经详细讲解过了,下面就让我们来看一下 方法是如何调用的 。 方法调用 首先,我们要明白一个基础性概念:方法调用并不是方法执行。其只是确定该调用哪一个方法而已(多态的影响,选择方法的不同版本)。并且因为 Java 调用的动态性,有些方法需要在类加载阶段动态解析,这也为 JVM 解析符号引用成直接引用提供了难度。 解析 在 JVM(五):探究类加载过程-上 中,我们说过在类加载过程的解析阶段, JVM 会将符号引用转变为直接引用。但这需要方法在程序真正运行的之前就有一个 可确定 的版本,且这个版本在整个运行期间是不可更改的。这种在类加载阶段就能解析出的方法调用被称为 解析 。 解析条件 满足解析条件的方法在 Java 语言中有 静态方法 和 私有方法 两类。前者与类类型直接关联,后者在外部无法被访问。这种特性也使得其不可能通过继承或别的方式来重写其版本,因此适合在解析阶段就进行处理。 在 JVM 内部与之相对应的就是 invokestatic 和 invokespecial 两种字节码指令。这两种指令对应的就是 调用静态方法 、 调用实例构造器 、 私有方法 、 父类方法 。 在执行这四类方法时

深入浅出计算机组成原理学习笔记:CISC和RISC-为什么手机芯片都是ARM?(第29讲)

久未见 提交于 2019-11-28 03:50:58
一、引子 我在第5讲讲计算机指令的时候,给你看过MIPS体系结构计算机的机器指令格式。MIPS的指令都是固定的32位长度,如果要用一个打孔卡来表示,并不复杂。 第6讲的时候,我带你编译了一些简单的C语言程序,看了x86体系结构下的汇编代码。眼尖的话,你应该能发现,每一条机器码的长度是不一样的。 而CPU的指令集里的机器码是固定长度还是可变长度,也就是 复杂指令集(Complex Instruction SetComputing,简称CISC)和 精简指令集(Reduced Instruction Set Computing,简称RISC)这两种风格的指令集一个最重要的差别。那今天我们就来看复杂指令集和精简指令集之间的对比、差异以及历史纠葛。 二、CISC VS RISC:历史的车轮不总是向前的 1、人月神话 在计算机历史的早期,其实没有什么CISC和RISC之分。或者说,所有的CPU其实都是CISC。 虽然冯·诺依曼高屋建瓴地提出了存储程序型计算机的基础架构,但是实际的计算机设计和制造还是严格受硬件层面的限制。当时的计算机很慢,存储空间也很小。 《人月神话》这本软件工程界的名著,讲的是花了好几年设计IBM 360这台计算机的经验。IBM 360的最低配置,每秒只能运行34500条指令,只有8K的内 存。为了让计算机能够做尽量多的工作,每一个字节乃至每一个比特都特别重要。 所以

这18条背下来没人敢和你忽悠CPU

这一生的挚爱 提交于 2019-11-28 02:38:07
http://hi.baidu.com/hieda/blog/item/eb78fd444c6e5748510ffe83.html 1.主频   主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度。CPU的主频=外频×倍频系数。很多人认为主频就决定着CPU的运行速度,这不仅是个片面的,而且对于服务器来讲,这个认识也出现了偏差。至今,没有一条确定的公式能够实现主频和实际的运算速度两者之间的数值关系,即使是两大处理器厂家Intel和AMD,在这点上也存在着很大的争议,我们从Intel的产品的发展趋势,可以看出Intel很注重加强自身主频的发展。像其他的处理器厂家,有人曾经拿过一快1G的全美达来做比较,它的运行效率相当于2G的Intel处理器。   所以,CPU的主频与CPU实际的运算能力是没有直接关系的,主频表示在CPU内数字脉冲信号振荡的速度。在Intel的处理器产品中,我们也可以看到这样的例子:1 GHz Itanium 芯片能够表现得差不多跟2.66 GHz Xeon/Opteron一样快,或是1.5 GHz Itanium 2大约跟 4 GHz Xeon/Opteron一样快。CPU的运算速度还要看CPU的流水线的各方面的性能指标。   当然,主频和实际的运算速度是有关的,只能说主频仅仅是CPU性能表现的一个方面,而不代表CPU的整体性能。   2.外频  

CPU位数,寻址能力,指令集,寄存器位数,操作系统位数

梦想的初衷 提交于 2019-11-27 05:11:37
part 1 CPU位数 = CPU中寄存器的位数 = CPU能够一次并行处理的数据宽度 = 数据总线宽度 操作系统位数 = 其所依赖的指令集位数 <= CPU位数 CPU寻址能力 = 2^S (s为地址总线宽度) <= CPU位数 chenqi@chenqi-OptiPlex-760:/$ cat /proc/cpuinfo | grep -i address address sizes : 36 bits physical, 48 bits virtual 表示物理内存寻址64G,虚拟内存寻址256T. (就是说,内存超过64G的部分也没什么用,硬盘超过256T的部分也没用) Linux下查看系统位数: chenqi@chenqi-OptiPlex-760:/$ getconf LONG_BIT 64 chenqi@chenqi-OptiPlex-760:/$ getconf WORD_BIT 32 上述信息显示这个系统时64位系统。 Linux下查看CPU硬件架构 chenqi@chenqi-OptiPlex-760:/$ arch x86_64 chenqi@chenqi-OptiPlex-760:/$ uname -m x86_64 chenqi@chenqi-OptiPlex-760:/$ echo $HOSTTYPE x86_64 part 2 http://en