数据寄存器

计算机组成

旧城冷巷雨未停 提交于 2019-12-06 07:45:55
CPU和内存是由许多晶体管组成的电子部件,通常称为IC(Integrated Circuit,集成电路) CPU内部: 寄存器:可以暂存指令、数据等处理对象,可以看作内存的一种 控制器:负责把内存中的指令、数据读入到寄存器,并根据指令的执行结果控制整个计算机。 运算器:负责运算从内存读入到寄存器的数据。 时钟:负责发出CPU开始计时的时钟信号,也有的计算机时钟位于CPU外部。 内存中的存储是由地址编号区分 寄存器的种类通过名字区分 来源: https://www.cnblogs.com/a19960101/p/11968830.html

接口技术第六章——输入输出接口及数据传输控制方式总结

老子叫甜甜 提交于 2019-12-06 04:14:53
正在学习接口技术和计算机组成原理,中间有一些重叠的部分就放在一起了,至于DMA,中断之类的会放在后面讲解 6.1 接口综述 硬件接口通常称为I/O接口,把外围设备同微型计算机连接起来的电路称为外设接口电路,简称外设接口。I/O接口是CPU同外界进行信息交换的中转站 使用接口的原因 速度不匹配 外设外慢 时序不匹配 各个外部设备都有自己的定时控制电路,以自己的速度进行传输,同CPU的时序不匹配 信息格式不匹配,不同的外设存储和处理信息的格式不同 信息类型不匹配,有些是数字电路,有些是模拟电路 CPU与外设之间所传送的数据类型 数据信息 包括模拟量,数字量,开关量,可以输入也可以输出 状态信息 这是I/O端口送给CPU的有关本端口所对应的外设当前状态的信息,供CPU参考分析 控制信息 这是CPU送给I/O设备的控制命令,使相应的外部设备完成特定的操作 在8086/8088中,这三种信息的输入输出基本一致,可以分发不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入输出的数据中设置特征位 接口的功能(背) 执行CPU命令 CPU将对外设的控制命令发到接口电路的命令寄存器中,以便控制外设按要求进行工作 返回外设状态 通过外设寄存器(状态口)完成,包括正常工作状态和故障状态 数据缓冲的功能 (平滑作用)接口电路中的数据寄存器(数据口)对CPU与外设设备之间的数据进行中转

深入理解JAVA虚拟机原理之Dalvik虚拟机(三)

我的未来我决定 提交于 2019-12-05 22:38:58
更多Android高级架构进阶视频学习请点击: https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用过的Dalvik虚拟机。 也许有人会问,既然Dalvik虚拟机都已经被废弃了,为什么我们还要了解它呢?出于下面的原因,让我觉得还是有必要了解一下Dalvik虚拟机的: Dalvik留下的很多机制在现在的Android系统是一样适用的,例如Dalvik指令,dex文件 并非每个人都是在最新版本的Android系统上工作 了解一项技术曾经的历史和演进过程,有助于增加对于现在状态的理解 Dalvik是Google专门为Android操作系统开发的虚拟机。它支持.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 Dalvik由Dan Bornstein编写,名字来源于他的祖先曾经居住过的小渔村达尔维克(Dalvík),位于冰岛。 栈 VS 寄存器 大多数虚拟机都是基于堆栈架构的,例如前面提到的HotSpot JVM。然而Dalvik虚拟机却恰好不是,它是基于寄存器架构的虚拟机。 对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史

STM32基本GPIO操作:点灯(库函数+寄存器)

和自甴很熟 提交于 2019-12-05 22:14:19
社团作业=_= 开发版上的LED灯负极连接在PB5口,正极串联一510Ω电阻后与3.3V相连 若开发板不带LED灯则需要自行连接,务必串联一个合适的电阻防止LED灯烧坏 零、一个有趣的延时函数 来自于开发板配套资料当中的例程,第一次看到的时候觉得耳目一新,代码如下: void Delay(u32 count) { u32 i = 0; for (; i < count; i++) ; } 当中的u32类型是在stm32f10x.h当中的一个宏定义,对应uint32_t,表示32位无符号型整数,在我的开发板当中就是unsigned int类型。 因为STM32的主频比电脑CPU慢得多,因此可以通过这种循环的方式来达到延时的效果 一、库函数版本 1.初始化 以下是初始化PB5端口的代码 // 定义一个类型GPIO_InitTypeDef,名字叫做GPIO_InitStructure的结构体 GPIO_InitTypeDef GPIO_InitStructure; // PORTB时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置结构体GPIO_InitStructure GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 设置GPIO端口号为5 GPIO

自制CPU的黑暗历程一

霸气de小男生 提交于 2019-12-05 20:50:46
数据通路 为了理解微程序控制器的设计思想,我们假设一个极简的数据通路(如下图1所示),由并联在单条8位总线BUS上的三个部件组成:指令寄存器IR(寄存器74LS273构成)、程序计数器PC(计数器74LS163构成)、程序存储器PROGRAM(ROM存储器2764构成)。 图1. 数据通路图 在数据通路上所能执行的某一种操作可以看作是一条对应的“指令”,则该数据通路能执行的所有操作可以用一个极简的指令集(只包含四条指令)来描述,如下表1所示: 表1. 微程序控制器指令集列表 按照上述指令表1的指令格式,用户可以编写一段机器语言程序存放在程序存储器PROGRAM中,如下表2所示。其中每一个存储器单元存放一个字节的数据,对应唯一的8位二进制地址(由地址寄存器AR锁存)。若用户需要访问程序存储器的某个单元,须由程序计数器PC提供该单元的地址,才能从程序存储器取出该单元中的数据。因为程序是顺序访问的,所以程序计数器PC是由两个计数器74LSl63级联构成的一个8位递增计数器PC。当前指令从程序存储器PROGRAM取出,并锁存到指令寄存器IR后,PC自动执行PC+1操作,指向相邻下一条指令。 表2. 程序存储器PROGRAM中的机器语言程序 微程序设计原理 仔细分析上述图1和表1可知,数据通路的各条指令状态图如下图2所示:所有指令的取指操作都是相同的,即是上图1中紫色箭头所示的指令流(ROM

程序员需要了解的硬核知识之汇编语言(一)

会有一股神秘感。 提交于 2019-12-05 19:27:07
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语言编写的代码,需要经过编译器编译后,转换为本地代码才能够被 CPU 解释执行。 但是本地代码的可读性非常差,所以需要使用一种能够直接读懂的语言来替换本地代码,那就是在各本地代码中,附带上表示其功能的英文缩写,比如在加法运算的本地代码加上 add(addition) 的缩写、在比较运算符的本地代码中加上 cmp(compare) 的缩写等,这些通过缩写来表示具体本地代码指令的标志称为 助记符 ,使用助记符的语言称为 汇编语言 。这样,通过阅读汇编语言,也能够了解本地代码的含义了。 不过,即使是使用汇编语言编写的源代码,最终也必须要转换为本地代码才能够运行,负责做这项工作的程序称为 编译器 ,转换的这个过程称为 汇编 。在将源代码转换为本地代码这个功能方面,汇编器和编译器是同样的。 用汇编语言编写的源代码和本地代码是一一对应的。因而,本地代码也可以反过来转换成汇编语言编写的代码

操作系统-存储器管理部分

别等时光非礼了梦想. 提交于 2019-12-05 18:15:59
存储器历来都是计算机系统中重要的组成部分。仍然是一种宝贵而又稀缺的资源。 如何对它加以有效的管理,不仅直接影响到存储器的利用效率,而且会影响系统的性能。 存储器的管理的主要对象是内存。在计算机执行时,几乎每一条指令都会涉及到对存储器的访问。 存储器的三个理想条件( 这三个条件从现在技术来讲是不可能同时达到的 ) 1.对存储器的访问速度要跟得上处理机的运行速度。 2.要求存储器要有很大的容量。 3.而且存储器的造价应该很低。 在现代计算机系统当中无一例外的采用了 多层结构的存储器系统 。 存储器的多层结构 对于通用计算机而言,存储层次至少应具有三级: CPU寄存器,主存,辅存 。 在存储层次当中,层次越高,存储介质的访问速度越快,价格越高,其存储容量越小。 寄存器,高速缓存,主存储器,磁盘缓存均属于操作系统中存储管理的管辖范畴。断电后它们所保存的信息将会消失。 固定磁盘,可移动存储介质的管理属于设备管理的范畴,它们存储的信息将被长期保存。 可执行存储器 在计算机系统的存储层次当中,寄存器和主存储器又被称为可执行存储器。 进程可以在很少的时钟时期内使用一条load或store指令对可执行存储器进行访问。而对辅存的访问则需要通过I/O设备来实现,所消耗的时间远大于访问可执行存储器所消耗的时间,一般相差3个数量级或者更多。 操作系统的存储管理负责对可执行存储器的分配

浅谈汇编

不羁的心 提交于 2019-12-05 16:46:38
创建编写汇编文件: 首先创建一个空文件 命名方式以.s结尾 第一行需要声明一个代码段 .text 第二行声明一个global + 方法名 .global test 指令: 汇编代码注释在行前加上 ; ret:返回 mov指令:目的寄存器,源操作数 举例:mov x0, #0x8 将8赋值给x0 add指令:将两个寄存器相加 sub指令:将两个寄存器相减 cmp指令:比较指令 操作数1 操作数2:cmp x0, x1 用x0减去x1,并将结果放到cpsr(程序状态寄存器)寄存器里 b 指令:跳转指令,相当于jump b 目标地址 bl指令:带返回的跳转指令,与b指令的区别是使用bl指令,ret指令才会生效 内存操作: 1、load,从内存中装载数据 ldr指令:从内存中读取数据 ldr x0, [x1] ldur指令: ,一般如果数据为负数,会用ldur ldp指令:从内存中读取数据,放到一对寄存器中 ldp w0, w1, [x2, #0x10] 2、store,往内存中存储数据 str指令:往内存中写入数据 str w0, [x1],将w0的数据写入到x1中 stur指令:参考ldur指令 stp指令:参考ldp指令 wzr指令:零寄存器 xzr指令:零寄存器 程序计数器: pc(Program Counter) 记录CPU当前指令是哪一条指令

深入理解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

CPU上下文切换详解

二次信任 提交于 2019-12-05 13:54:12
我们都知道CPU上下文切换,会增加系统负载。那什么是CPU上下文,为什么要切换? 什么是CPU上下文 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。 CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文。 而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。 根据任务的不同,CPU的上下文切换可以分为不同的场景,也就是进程上下文切换、线程上下文切换、中断上下文切换。 进程上下文切换 Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级的 Ring 0 和 Ring 3。 内核空间(Ring 0)具有最高权限,可以直接访问所有资源;