指令集

附录---cpu详解

情到浓时终转凉″ 提交于 2019-12-18 09:57:24
02 附录---cpu详解 一 五大组成单元=>三大核心组件 组成计算机五大单元可以合并成三大核心组件:CPU、IO设备、主存储器 1、控制单元+算数逻辑单元=>CPU 2、主存储器,即主記憶體 3、输入单元Input+输出单元Outpu=>IO设备 插图:三大核心组件 二 cpu工作流程 CPU的核心工作在于进行运算和判断,那么要被运算与判断的数据是从哪里来的? CPU读取的数据都是从主存储器(内存)来的!主存储器内的数据则是从输入单元所传输进来!而CPU处理完毕的数据也必须先写回主存储器中,最后数据才从主存储器传输到输出单元。 所以计算机五大组成部分的基本工作流程就是:输入单元=>主存储器=>CPU=>主存储器=>输出单元 而CPU会从内存中取指令->解码->执行,然后再取指->解码->执行下一条指令,周而复始,直至整个程序被执行完成。 所以总结CPU的大致工作流程就是:取指—>解码—>执行,详细见下图 插图:cpu工作流程详解 三 cpu指令集 cpu是计算机的大脑,大脑里集成了一系列具体控制身体其他器官做事的指令集,所以站在纯硬件角度去看,计算机所有其他组件都由cpu发出的指令控制。 我们程序员编程的目的是为了控制计算机硬件工作,程序员的代码都会转换成cpu的指令集才能去控制其他硬件,所以程序员是通过直接控制cpu来达到间接控制其他硬件的目的,具体流程如下 插图

交叉编译链版本导致bin文件不同的原因

倖福魔咒の 提交于 2019-12-17 00:08:41
我的ubantu上安装的是4.6.4版本的arm-linux-gcc交叉编译工具。使用韦东山源码的时候,发现编译出的bin文件与源码中bin文件不一样。 我们首先要弄清楚指令集的概念, JZ2440使用arm9核,该CPU核使用的指令集是armv4; 所谓指令集,指的是汇编指令的版本;比如cortex a7等更先进的CPU核它支持某些新的指令,而ARM9不支持这些指令。 你使用比较新的编译器时,它默认支持的指令集一般就不是armv4了; 如果不进行特别指定,编译出来的BIN文件烧在JZ2440上是无法运行的:因为CPU不认得某些新指令,无法执行某些新指令。 一般来说,新的编译器会兼容老的芯片,但是需要告诉编译器,让它使用老的指令集来编译程序。 所以,你当然可以使用4.4的工具链来编译jz2440程序,需要做的是:指定它,使用armv4指令集。 方法如下: 使用3.4.5工具链时,我们这样编译:arm-linux-gcc -c -o led.o led.c // 默认使用armv4 使用4.4等工具链时,这样编译:arm-linux-gcc -march=armv4 -c -o led.o led.c // 默认不是armv4,需要手工指定 问题2: 相信你已经知道答案了, 首先要确定你的CPU核使用哪些指令集, 是否支持软件浮点, 你想使用glibc还是uclibc,

三种主流芯片架构

本秂侑毒 提交于 2019-12-11 06:03:29
三种主流芯片架构简单比较 三种主流芯片架构   1. ARM ARM是高级精简指令集的简称(Advanced RISC Machine),它是一个32位的精简指令集架构,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。 ARM处理器的主要特点是: (1)体积小、低功耗、低成本、高性能——ARM被广泛应用在嵌入式系统中的最重要的原因 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件; (2)大量使用寄存器,指令执行速度更快; (3)大多数数据操作都在寄存器中完成; (4)寻址方式灵活简单,执行效率高; (5)指令长度固定。 (6)Load_store结构:在RISC中,所有的计算都要求在寄存器中完成。而寄存器和内存的通信则由单独的指令来完成。而在CSIC中,CPU是可以直接对内存进行操作的。 流水线处理方式。    2. MIPS MIPS架构(英语:MIPS architecture,为Microprocessor without interlocked piped stages architecture的缩写,亦为Millions of Instructions Per Second的相关语),是一种采取精简指令集(RISC)的处理器架构,1981年出现,由MIPS科技公司开发并授权

当我们追踪源码时,要追踪到什么程度?

别等时光非礼了梦想. 提交于 2019-12-10 23:48:08
源码追踪,是所有开发工程师要迈出的一道门槛。不会源码追踪,或者不习惯于研究出色开源组件的源码,注定会限制自己的成长,也无法广泛借鉴更多的编程技巧和工程思想。不会追踪源码,就像是不会识字的文盲,没办法在海量的知识海洋中遨游与成长。 前两天看到一篇知乎热文:《 你都有哪些面试时被虐的经历? 》,以极其幽默的方式描述了在技术上被蹂躏的过程。究其原因,毫无疑问是基础不牢固。但为什么会基础不牢固?无非就是在研究、钻研技术时,没有打破砂锅问到底。但我们可以进一步细问,什么叫做打破砂锅问到底?要问到什么程度才叫做到底了? 这几乎就等价于,当你追踪源码时,到底要追踪到什么程度?是追踪到你当前所用框架的实现工具层?还是要追踪到系统API调用层?又或是追踪到你语言本身的实现层次?哪里是个尽头?应该到哪里才是尽头? 回顾上面那篇知乎热文,其实有很多可以琢磨的细节。如果完全以虚心学习的态度来讲,面对拷问细节的面试官,当然是要承认自己实力的不足,知耻而后勇地努力学习。但如果从另一个角度去思考,会体现出一些非常无奈的事实:我自己的工作中就用到这个程度,为什么要问到如此细节?好不容易看了一下这个feature的实现,知道调用了系统底层的某个函数,你偏偏要问,那个系统函数是如何实现的。好不容易知道那个系统函数的实现思路,你非要问,在语言层面是什么特性保证了该实现的合理性。 如此种种,到底何时是个头

DSP微架构

若如初见. 提交于 2019-12-10 12:49:02
微架构又叫指令集架构(Instruction Set Architecture,ISA). DSP的微架构(流水线,指令集,基本运算单元等) SIMD:单指令多数据流,用于打包指令集 整数 四级流水:取指(instruction fetch) 解码(instruction decode) 执行(Execute) 写回 流水线是否越深越好? 当然不是合适最好。流水线越深吞吐率越高性能越好,但同时浪费越大,面积消耗越大。 指令集:存储在CPU内部,对CPU的运算进行指导和优化的硬程序。Intel主要有X86,SSE等指令集。 来源: CSDN 作者: 司cc 链接: https://blog.csdn.net/yuxiaoxi21/article/details/93618377

java字节码指令集

匆匆过客 提交于 2019-12-10 04:13:30
字节码指令集   Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。   对于大部分为与数据类型相关的字节码指令,他们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference。   加载和存储指令: 将一个局部变量加载到操作栈的指令包括有: iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n> 将一个数值从操作数栈存储到局部变量表的指令包括有: istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n> 将一个常量加载到操作数栈的指令包括有: bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d> 扩充局部变量表的访问索引的指令: wide   运算指令:

Java字节码扩展

拈花ヽ惹草 提交于 2019-12-06 14:52:31
异常表 代码一: public class Test03 { public void test() { try { InputStream is = new FileInputStream("123.txt"); ServerSocket serverSocket = new ServerSocket(1234); serverSocket.accept(); } catch (FileNotFoundException f) { } catch (IOException i) { } catch (Exception e) { } finally { System.out.println("finally"); } } } 编译代码一,然后利用javap进行反编译查看结果: ... Code: stack=3, locals=4, args_size=1 0: new #2 // class java/io/FileInputStream 3: dup 4: ldc #3 // String 123.txt 6: invokespecial #4 // Method java/io/FileInputStream."<init>":(Ljava/lang/String;)V 9: astore_1 10: new #5 // class java/net/ServerSocket

4.计算机层次与编程语言

给你一囗甜甜゛ 提交于 2019-12-05 19:27:27
转:https://www.cnblogs.com/sum-41/p/11496304.html 程序翻译与程序解释 计算机是无法直接理解人类语言的,它只认识01010101...这样的比特位,因此,我们需要进行程序翻译或程序解析,把人类语言翻译或解析成计算机所能理解的语言。 那么程序翻译和程序解析这两者之间有什么区别和联系呢?为了理解问题,我们引入两个语言,一个是较为高级的计算机语言——L1,另一个是较为低级的计算机语言——L0,我们接下来会使用这两个语言作为例子来理解什么是程序翻译,什么是程序解析。 程序翻译 假设我们现在使用较为高级的计算机语言L1来进行程序的逻辑描述,也就是说我们使用L1来编写程序,那么这个由L1编写的程序是怎么样执行的呢?当然了,它不是直接执行的,而是在执行的时候生成一个逻辑等价的由低级语言L0组成的程序,这个L0是计算机实际执行的语言,那么由L1生成L0这个过程,我们称之为程序翻译,用于生成L0的工具叫编译器。 程序解析 同样的,假如我们使用L1来进行程序的逻辑描述,那么这个由L1编写的程序是怎样执行的呢?为了执行L1,我们还需要使用L0实现另外一个程序,这个程序把L1程序作为输入来进行执行,每一句L1程序会在L0所实现的程序里面进行等价的转换,然后执行,这就是程序的解析,其中,使用L0实现的程序叫做解释器。 简要的总结程序翻译和程序解析:

深入理解java虚拟机(11):基于栈的字节码解释执行引擎

空扰寡人 提交于 2019-12-05 16:32:16
1、解释执行 编译过程如下 2、基于栈的指令集和基于寄存器的指令集 java编译器输出的指令流,基本是一种基于栈的指令集架构,指令流中的大部分指令都是零地址,依赖于操作数工作。与之相对的是基于寄存器的指令集,也就是目前pc支持的指令集。两者的不同,举例如下: 1+1基于栈的指令集iconst_1,iconst_1,iadd,istore_0,基于寄存器的指令集 mov eax 1,add eax 1。基于栈的指令集主要优点就是可移植性强,寄存器由硬件直接提供,程序直接依赖于这些硬件。基于栈的指令集可以自行决定是否将频繁访问数据放到寄存器中获得更好的性能,代码紧凑,编译器实现更加简单。因为栈实现在内存中和指令数量,所以基于栈的指令集要慢些。 3、基于栈的解释执行过程 public int calc(){ int a=100; int b=200; int c=300; return (a+b)*c; } public int calc(): Code: Stack=2,Locals=4,Args_size=1 0:bipush 100 2:istore_1 3:sipush 200 6:istore_2 7:sipush 300 10:istore_3 11:iload_1 12:iload_2 13:iadd 14:iload_3 15:imul 16:ireturn

llvm编译系统结构分析

核能气质少年 提交于 2019-12-05 06:17:41
LLVM 编译系统分析 中间代码 工具集 编译流程 整个 LLVM 编译系统的组成可分成三部分:LLVM 中间代码,用于分析、 优化、代码生成等工作的集成库,以及建立在以上集成库基础之上的工具,包括汇 编器、链接器、调试器等等。本章将先依次分析这三个组成部分,然后再对 LLVM 的编译流程作详细的说明。 中间代码 LLVM 中间代码是一种采用 SSA 形式的 IR(Immediate Representation,中间 表达),使用的指令集为 LLVM 虚拟指令集。该指令集是一个类似 RISC(Reduced Instruction Set Computer,精简指令集计算机)的三地址指令集,含有简单的控制 指令和使用带类型指针的访存指令,拥有独立于高级语言和目标处理器的语法,易 于进行代码分析和优化。使用 LLVM 虚拟指令集的 LLVM 中间代码可以三种方式 存在:存在于内存中的编译器 IR、存在磁盘上的字节码(bytecode)、以及可供人 阅读的汇编代码。这三种存在方式是同一中间代码的不同表达形式,可分别用于: 在编译器执行编译遍时提供方便高效的中间代码转换或者中间代码分析、作为 JIT 编译器(Just-In-Time Compiler)在本地执行客户处理器代码的格式、以及方便开 发人员进行代码调试的汇编代码。LLVM 中间代码由虚拟指令集、中间代码高层结构