首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文了解指令集和微架构

编译器在这个过程中,要经过编译、汇编、链接等几个步骤, 最后生成"可执行文件",可执行文件中保存的是二进制机器码,这串机器码可以直接被CPU读取和执行。...上图表示在指令寄存器中正在执行的一段为00101110机器码,左四位0010为指令集LOAD_A(汇编代码,将数据放到寄存器A),右四位1110(RAM地址,就是要去取这个地址上的8bit 机器码数据放到寄存器...因为芯片与集成开发环境-IDE都遵循相同的指令集标准,所以高级语言编写的程序经指定编译器编译后能直接运行在对应的CPU上,反之则不能运行。...所以,CPU在设计之前,就需要先设计一套指令集或者说使用现成的指令集(如ARM、X86指令集)并在硬件电路上实现这些指令。...CPU设计好后,还需要配套的编译器,编译器也需要参考这个指令集标准,将我们编写的C程序、C++等程序编译成CPU硬件电路支持的加减乘除、与或非等指令,我们的程序才能在CPU上运行。

2.3K31

计算机基础(5)——编程语言与跨平台

每种CPU架构都有自己的指令集,这些指令集决定了CPU能够执行哪些操作以及如何执行这些操作。因此,不同的CPU架构会有不同的汇编语法和编译器。...而mips的,可能是add $t0,$t0,$t1。 不同CPU架构上的汇编语言指令不同,不同操作系统之间的指令也可能不一样,而为了统一一套写法,同时又不失汇编的表达能力,因此高级编程语言就诞生了。...如果需要将该hello程序运行在arm架构的CPU上,我们只需要安装arm架构的编译器,将该hello程序的源代码编译成符合arm架构的汇编指令,最终再由汇编器编译成arm架构的机器指令即可。...实际上,高级语言(例如C)在编译成汇编指令或执行该汇编指令时,编译器与指令需要与操作系统做交互,不同的操作系统提供的系统API、系统的资源管理等都会有所不同,因此高级语言在编译成汇编时不仅要考虑CPU架构...实际上,C语言编写的源代码程序想要在windows平台运行还要考虑到操作系统的因素,那么完整的说法应该是需要安装windows平台基于x86架构的编译器,才能在使用了x86架构的CPU并安装了windows

9531
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    汇编语言之GNU ARM

    什么是编译器 将高级语言翻译成机器语言或者汇编语言的工具 汇编器和编译器的区别 汇编器的服务对象是汇编语言,编译器的服务对象是高级语言 汇编器和汇编语法伪指令的关系 不同的CPU对应不同的指令集 ,不同的汇编器对应不同的伪指令集和汇编语法...每种汇编器都可以有自己的伪指令集和自己的语法 使用不同的汇编器汇编同一个cpu架构的汇编代码,所对应的指令绝对是一致的,但伪指令各有千秋 ;使用ARM官方的汇编器 AREA test, CODE...ARM官方原生的汇编器,集成在了ADS工具上,适用于ARM架构,我们也一般称之为ADS汇编器 两种ARM汇编器的各自用途 ARMASM汇编器:一般用于windows平台 GAS汇编器:支持windows...指令和伪指令的区别 指令: 有与之对应的机器码,能被cpu所识别,和编译器无关 伪指令:没有与之对应的机器码,无法被cpu识别,只能被编译器识别,不同编译器伪指令不一样 不同的CPU对应不同的指令集;不同的汇编器对应不同的语法和伪指令集...END ;使用extern伪指令 AREA code, CODE extern fun1 END 两者区别: import:不管当前文件是否使用该引入的函数,该标签都会加入当前文件符号表

    2.2K30

    APP生成与运行(一)

    一、编译 汇编 CPU 由上亿个晶体管组成,在运行的时候,单个晶体管只能根据电流的流通或关闭来确认两种状态,我们一般说 0 或 1,根据这种状态,人类创造了二进制,通过二进制编码我们可以表示所有的概念。...我们将一组二进制代码合并成一个指令或符号,创造了汇编语言,汇编语言以一种相对好理解的方式来编写,然后通过汇编过程生成 CPU 可以运行的二进制代码并运行在 CPU 上。...编译器优化 LVVM优化器会进行BitCode的生成,链接期优化等等 编译器后端 LLVM机器码生成器会针对不同的架构,比如arm64等生成不同的机器码 四、Xcode执行Build的流程 dSYM...文件 我们在每次编译过后,都会生成一个dsym文件。...这样做,可以只编译当前的版本,比如arm7/arm64等等,记得只开启Debug模式。这个选项在高版本的XCode中自动开启了。 Debug模式下,关闭编译器优化

    1.1K10

    Linux内核29-原子操作

    假设有两个不同的内核控制路径运行在两个CPU上,同时尝试RMW操作相同的内存区域且执行的是非原子操作。...起初,两个CPU尝试读取相同位置,但是内存仲裁器(促使串行访问RAM的电路)确定一个可以访问,让另一个等待。但是,当第一个读操作完成,延时的CPU也会读取相同的旧值。...但是等到两个CPU都往这个内存区域写入新值的时候,还是由内存仲裁器决定谁先访问,然后写操作都会成功。但是,最终的结果却是最后写入的值,先写入的值会被覆盖掉。...2.2 ARM原子指令 但是,ARM体系架构中不存在lock指令,所以它在原子指令的实现上是不一样的。...3 Linux原子操作 但是,我们在编写完C代码后,编译器不能保证给你使用原子指令进行替代。因此,Linux内核提供了atomic_t类型变量并提供了相关的操作函数和宏(如表5-4所示)。

    91310

    【反复横跳】从AC5到AC6转型之路(1)——补救和准备

    虽然这三个编译器都是由Arm所维护和提供的,但前两者算是彼此兼容的编译器: 使用共同的 armlink 使用相同的方式来描述地址空间布局(分散加载脚本 scatter script) 从Arm Compiler...---- 其实,这里 armclang 也是个二道贩子——它也是调用 armasm 来完成编译的,只不过在这之前,它会默认用C预编译器对汇编源代码进行预处理,换句话说,折磨armasm很多年的“如何在汇编代码中使用...3、在线汇编(Inline Assembly)和嵌入C代码的汇编(Embedded Assembly) 无论你是否了解 Arm Compiler 5所支持的这两种在C语言中使用汇编的方法,也不用关心它们的区别...,结论是——任何Arm Compiler 5下的C代码只要使用了上述两种方法之一,基本上就是“需要手工干预”的。...一般来说,编译器的宏检测有两个思路: 借助某一编译器独有的特征宏来判断编译器 借助多个编译器共有但值不同的宏来判断 对于第一种思路,有两个比较有名的宏:__GNUC__ 和 __clang__ 。

    5K30

    【译】超硬核|在自制的 CPU 上运行 Rust

    选择 ARM 是因为它支持ARM Thumb指令集的一个子集,它本身就是ARM CPU所支持的多个指令集之一。它使用32位字,但指令的宽度为16位。...从地址0xFFFFFF18中读取一个字节,就可以知道键盘缓冲区是否为空。 运行代码 在这个东西上运行代码的最简单方法是简单地编写机器代码并将其加载到ROM中。 这里有一个简单的程序。...我需要使用我自己的汇编器,所以我直接调用编译器,告诉它发出原始汇编代码,然后将其发送到我的汇编器,最后生成可加载的二进制文件。...我甚至不能使用编译器的内置函数:像memcpy或memclr这样的函数经常被用来执行块拷贝,但它们并不存在于生成的汇编中,所以我不得不自己实现它们(我从Redox这里借用了一些代码)。...ARM/Thumb是一个很好的架构,可以作为一个辅助项目来实施,因为它得到了编译器的良好支持,而且它的一个足够小的子集就足以运行有趣的代码。

    1.6K30

    多样性计算时代,鲲鹏迁移和调优关键技术全解读

    基于此,鲲鹏汇编总体设计方案为“W+ 二”。其中,“W”由四个步骤完成,分别是汇编注解、局部异构平台反编译、编译优化和代码生成。...汇编注解解决了汇编样式多样的问题,局部异构平台反编译解决平台差异问题,代码质量由编译器的编译优化和代码生成完成。...比如在汇编代码的识别上,如果用传统的方式去查找,会漏掉很多汇编代码,因此需要使用编译器的语法能力,如 LLVM 的 Clang-Tidy 工具框架,通过在源代码里生成的抽象语法树,找到汇编代码并进行自动翻译...至于复杂的汇编,虽然情况各有不同,但也可以一键翻译成为鲲鹏的汇编代码。...具体实现上,ExaGear 将 guest 应用的 x86 或 ARM32 指令翻译成 ARM64 指令,并模拟 guest 应用调用的操作系统 API。

    67430

    支付宝如何优化移动端深度学习引擎?

    2.1.基于C/C++的基本优化 编译器很牛逼,GCC/CLANG都有运行速度的优化选项,打开这些选项大部分情况下都会帮你的程序速度提升不少,虽然这还远远不够,但聊胜于无。...如果某次循环运行比较慢或者循环次数不能平均分配时,容易出现负载不均衡的情况,这时就必须有动态调度的机制,动态调度可以根据线程的运行快慢,决定是否“互相帮助”。...相对编译器产生的代码,手工纯汇编的好处还是非常明显的,比如精简的栈内存,高效的寄存器利用,充分的流水线优化等等,有一种一切尽在掌握的快感。...3.1.编译优化 编译器有针对大小的编译选项,比如GCC的-Os, 相当于可以同时打开-O2的优化效果,同时精简生成目标文件的尺寸,生成目标代码后,链接成动态库的时候,可以通过strip命令,去掉多余的调试代码...3.2.代码精简 以上都是一些常规的缩小库大小的方法,实际上,针对DL模型的特性还可以进一步精简库大小,比如包括: 库依赖简化- 大部分开源引擎都会依赖C++ STL库,如Caffe/Tensorflow

    1.2K40

    arm汇编指令详解带实例_汇编buf指令

    伪指令:伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。...两个 S 用于不同的指令,名称相同,但是在不同的指令结合却有不同的作用 条件执行后缀 **注意** - 条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果...- 条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行。 多指令流水线 为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。...ARM汇编伪指令 伪指令的意义 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。 伪指令的意义在于指导编译过程。...伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。 GUN汇编中的一些符号 @ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似。

    1.4K11

    Ubuntu实现树莓派交叉编译

    有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行所需要的编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器...常见的交叉编译例子如下: 1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。...2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。...3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。...找不到,确定arm-linux-gnueabihf-XXX -v 是否能输出正确信息,如果能,可以切到root下进行编译 三、编译源代码 1、在写编译脚本时,一定要确保编译器写的是交叉编译的编译器

    2.6K50

    MIPS架构深入理解1-MIPS和RISC架构体系介绍

    CPU并在Cache中留下备份。...所有的指令都是严格遵守流水线的各个阶段,即使某个阶段什么也不做。这样做的结果就是,只要Cache命中,每个时钟周期CPU都会启动一条指令。...(MIPS架构的汇编也是最简单易懂的代码之一) 尽管有这些问题,但是MIPS架构的设计者也在思考,如何使CPU可以被编译器更加简单高效地优化。...而且,MIPS指令集的授权和ARM指令集的授权有着本质上的不同:MIPS授权后,允许设计厂商自行对架构或者指令集进行自定义;但是ARM授权不允许厂商对其授权的架构进行自定义(当然了,近些年,ARM也已经授权了苹果...有一种推荐的子程序调用时堆栈栈帧布局,这样可以混合使用汇编语言和C语言编程,使用不同的编译器选项进行编译。但是这一切和硬件都没有关系,需要人为实现。

    8.1K21

    JVM之执行引擎

    用它编写的程序一经输入计算机,CPU直接读取运行,因此和其他语言编的程序相比,执行速度最快。 机器指令与CPU紧密相关,所以不同种类的CPU所对应的机器指令也就不同。...如常见的 x86指令集,对应的是x86架构的平台 ARM指令集,对应的是ARM架构的平台 3.3、汇编语言 由于指令的可读性还是太差,于是人们又发明了汇编语言。...编译过程又可以分成两个阶段:编译和汇编 编译过程:是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码 汇编过程:实际上指把汇编语言代码翻译成目标机器指令的过程...解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行。...1)Interpreter模块:实现了解释器的核心功能   2)Code模块:用于管理HotSpot VM在运行时生成的本地机器指令 解释器的现状 由于解释器在设计和实现上非常简单,因此除了

    11000

    jvm之执行引擎解读

    但是编译的缺点是程序不易移植,因为不同的操作系统、硬件架构等都需要不同的编译后的代码。 解释的优点是代码的可移植性,因为解释器可以在不同平台上运行相同的代码。...机器指令与CPU紧密相关,所以不同种类的CPU所对应的机器指令也就不同。  指令 由于机器码是有0和1组成的二进制序列,可读性实在太差,于是人们发明了指令。...如常见的 x86指令集,对应的是x86架构的平台 ARM指令集,对应的是ARM架构的平台 汇编语言 由于指令的可读性还是太差,于是人们又发明了汇编语言。...JIT编译器 Java代码的执行分类 第一种是将源代码编译成字节码文件,然后在运行时通过解释器将字节码文件转为机器码执行 第二种是编译执行(直接编译成机器码,但是要知道不同机器上编译的机器码是不一样...,这样,只要系统运行时间足够长,绝大部分方法都会被编译成本地代码。

    26130

    交叉编译概念详解

    交叉编译: 交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序: 比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM...交叉编译时,这些值在主机系统和目标系统之间会有所不同,因此在主机系统上运行测试会给出错误的答案。...当目标没有该程序包或版本不兼容时,配置还可以检测主机上是否存在该程序包并包括对该程序包的支持; HOSTCC vs TARGETCC:许多构建过程需要编译内容才能在主机系统上运行,例如上述配置测试或生成代码的程序...同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。...3.2 Glibc Linux 上通常使用的 C 函数库为 glibc。glibc 是 linux 系统中最底层的 api,几乎其它任何运行库都会依赖于 glibc。

    4.3K10

    iOS: ARM64不定函数传参问题调试剖析

    目前,主流移动设备CPU主要采用ARM处理器。在做移动客户端开发时,难免遇到需要分析汇编代码的情况,牵涉到过程调用的部分就必须要了解相应平台的ABI。...生成的汇编传递的是参数在栈上的地址;调用两个参数时,依次传递了第二个参数和第一个参数的地址。...查看编译器生成的汇编代码,定位到语句(*processIMP)(self, processSEL, value);相关的汇编指令(Assembly 4-1.1 & Assembly 4-1.2)。...结论 至此,crash的问题终于有了结论:由于不同CPU体系结构——或者说是不同平台——导致的问题。...在iOS设备上,通过IMP指针直接调用方法时,编译器按照调用不定参数函数的方式传递参数,除了前两个id和SEL参数,其他参数被作为变参列表压栈;被调方法的参数列表是固定的,编译器生成代码时则按照固定函数传参的方式获取实参

    2.5K33

    ARM Neon Intrinsics 学习指北:从入门、进阶到学个通透

    intrinsics是以类似调用C语言函数的方法调用Neon,并由编译器生成最终的二进制代码,assembly则是手工嵌入Neon汇编,直接生成二进制代码。...学个通透:了解原理 3.1 SIMD加速原理 3.2 了解硬件决定的速度极限:Software Optimization Guide 3.3 反汇编分析生成代码质量 4....---- 2 进阶 2.1 与Neon相关的ARM体系结构 利用指令集加速,无一例外地要利用专用寄存器这种在CPU上稀少、宝贵的资源。...不同架构的吞吐量上界会有所不同,其他架构请自行在ARM官网文档中心下载。 ?...(https://zhuanlan.zhihu.com/p/268925243) 3.3 反汇编分析生成代码质量 可通过反汇编的方式查看Intrinsics 生成的汇编是否满足预期,如果不满足预期则进行手写汇编优化

    4.7K41

    JVM执行引擎(Execution Engine)

    指令集 由于指令是应用于硬件基础上的,但由于随着硬件发展得非常快以及各个厂商的硬件对用的架构不一样所以所产生的指令也不一样,所以每个平台所支持的指令称为指令集。...比如: x86指令集,对应的是x86架构平台。 ARM指令集,对应的是ARM架构平台。 汇编语言 随着时间的推移,人们又发现指令集也是比较麻烦可读性还是比较差,然后又发明了汇编语言。...什么是jvm的执行引擎? 执行引擎是JVM的核心组成部分之一,主要用来执行Java生成.class的字节码,解析成各种cpu所能执行的二进制指令。...JVM会根据代码被调用的频率来判断这块代码或这行代码是否是热点代码,如果达到一定阀值则会被JIT编译器探测到,然后将其直接编译为对应平台的本地机器指令,以此提升Java程序的执行性能,这种就叫热点探测。...最后 JVM执行引擎是JVM的核心功能,主要起到翻译工作,当然有直接翻译和间接翻译(JIT),起到非常关键的作用,通过热点探测进行统计是否通过编译器进行生成系统可执行的机器码,对后续相关的对象逃逸也跟此内容关联极大

    1.2K20

    JVM-执行引擎

    再后来,Java也发展出可以直接生成本地代码的编译器。 现在JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。...用它编写的程序一经输入计算机,CPU直接读取运行,因此和其他语言编的程序相比,执行速度最快。 机器指令与CPU紧密相关,所以不同种类的CPU所对应的机器指令也就不同。...如常见的 x86指令集,对应的是x86架构的平台 ARM指令集,对应的是ARM架构的平台 汇编语言 由于指令的可读性还是太差,于是人们又发明了汇编语言。...编译过程:是读取源程序(字符流),对 之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码 汇编过程:实际上指把汇编语言代码翻译成目标机器指令的过程。...C1和C2编译器不同的优化策略 在不同的编译器上有不同的优化策略,C1编译器上主要有方法内联,去虚拟化、冗余消除。

    79941

    linux内核学习(四)之回顾简单的汇编知识(一))

    大家周末晚上好,今天给大家分享一些简单的汇编知识;说起汇编,不管是学习或者说工作中,都会或多或少的接触到,比如说学习中,在进入c语言编程世界之前,都会有一段汇编作为引导来进入c的;当然在实际开发当中,现在用汇编来开发的比较少...beq __error_a @ yes, error 'a' 这里讲的汇编代码书写风格是基于arm处理器,如果是Intel(AMD)的汇编风格是这样的: subq $16, %rsp movl...(1)ARM状态下的通用寄存器与程序计数器: (2)ARM状态下的程序寄存器: 注意上面表格中小影阴直角三角形表示的是分组寄存器,所谓分组寄存器,就是说是当前模式下独有的,不共享。...SP:栈指针,存储栈地址,比如有个CPU,然后还有个外部资源也就是内存,我们想象CPU在程序跳转的时候在运行是最核心的ALU单元,然后外部资源存储着程序A和程序B还有程序C,实际上在CPU在读程序A的时候...2、(汇编)伪指令: 它本质上不是指令(只是和 指令一起写在代码中),它是编译器环境 提供的,目的是用来指导编译过程,经过 编译后伪指令最终不会生成机器码。

    54510
    领券