指令寄存器

80C51存储器与C51内存优化

一个人想着一个人 提交于 2020-04-07 12:13:32
80C51在物理结构上有四个存储空间:片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。但在逻辑上,即从用户使用的角度上,80C51有三个存储空间:片内外统一编址的64KB的程序存储器地址空间(用16位地址)、256B的片内数据存储器的地址空间(用8位地址,其中128B的专用寄存器地址空间仅有21个字节有实际意义)以及64KB片外存储器地址空间。 1、程序存储器 程序存储器用于存放编好的程序和表格常数。80C51片内有4KB ROM,片外16位地址线最多可扩展64KB ROM,两者是统一编址的。如果EA端保持高电平,80C51的程序计数器PC在0000H——0FFFH范围内(即前4KB地址)是执行片内ROM的程序。当寻址范围在1000H——FFFFH时,则从片外存储器取指令。当EA端保持低电平时,80C51的所有取指令操作均在片外程序存储器中进行,这时片外存储器可以从0000H开始编址。 程序存储器中,以下6个单元具有特殊功能。 0000H:80C51复位后,PC=0000H,即程序从0000H开始执行指令。 0003H:外部中断0入口。 000BH:定时器0溢出中断入口。 0013H:外部中断1入口。 001BH:定时器1溢出中断入口。 0023H:串行口中断入口。 2、数据存储器 数据存储器用于存放中间运算结果、数据暂存和缓冲、标志位等。80C51片内有256B

ARM指令集----杂项指令

纵然是瞬间 提交于 2020-04-07 05:35:59
ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load、Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种是直接向PC寄存器写入目标地址的值 通过直接向PC寄存器写入目标寄存器的数字可以实现在4GB 地址空间的任意跳转,这种跳转又称为长跳转,如果在残肢令前面使用MOV LR,PC等指令,可以保存返回来的地址值,这样就实现了在4GB空间中的子程序调用 ARM的跳转指令可以从当前指令向前或者是向后的32位的地址进行空间跳转,这类跳转指令有一下4种 B 跳转指令 BL带换回的跳转指令 BLX 带返回的跳转和切换指令 BX 带状态切换的跳转指令 B和BL的区别在于,L决定是否将PC寄存器的数字保存到LR寄存器中, BL指令用于实现子程序的调用,子程序的返回地址可以将LR寄存器的值复制到PC寄存器来实现 数据处理指令 数据处理指令包括如下指令   MOV 数据传送指令   MVN 数据求反传送指令:MVN指令有以下用途:先寄存器传递一个负数,生成位的掩码,求一个数的反码   CMP 比较指令:   CMN 基于相反数的比较指令   TST 位测试指令 :TST指令通常是用于测试寄存器中某些位是1还是0   TEQ 测试相等指令:TEQ用来比较两个数是否相等ORR指令   ADD 加法指令

c语言中的代码优化《转》

痴心易碎 提交于 2020-04-06 03:03:44
在性能优化方面永远注意80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码。不要优化程序中开销不大的那80%,这是劳而无功的。 第一招:以空间换时间   计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值: 方法A:通常的办法 #define LEN 32 char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,"This is a example!!"); 方法B: const char string2[LEN] ="This is a example!"; char * cp; cp = string2 使用的时候可以直接用指针来操作。 从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活 性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执 行的高效率。 如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。 第二招: 使用宏而不是函数。   这也是第一招的变招

单片机的组成、工作原理、分类、特点以及发展趋势

白昼怎懂夜的黑 提交于 2020-04-05 16:18:13
芯片在没有开发前,单片机只是具备功能极强的超大规模集成电路,如果赋予它特定的程序,它便是一个最小的、完整的微型计算机控制系统,它与个人电脑(PC机)有着本质的区别,单片机的应用属于芯片级应用,需要用户了解单片机芯片的结构和指令系统以及其它集成电路应用技术和系统设计所需要的理论和技术,用这样特定的芯片设计应用程序,从而使该芯片具备特定的功能。 不同的单片机有着不同的硬件特征和软件特征,即它们的技术特征均不尽相同,硬件特征取决于单片机芯片的内部结构,用户要使用某种单片机,必须了解该型产品是否满足需要的功能和应用系统所要求的特性指标。这里的技术特征包括功能特性、控制特性和电气特性等等,这些信息需要从生产厂商的技术手册中得到。软件特征是指指令系统特性和开发支持环境,指令特性即我们熟悉的单片机的寻址方式,数据处理和逻辑处理方式,输入输出特性及对电源的要求等等。开发支持的环境包括指令的兼容及可移植性,支持软件(包含可支持开发应用程序的软件资源)及硬件资源。要利用某型号单片机开发自己的应用系统,掌握其结构特征和技术特征是必须的。 单片机控制系统能够取代以前利用复杂电子线路或数字电路构成的控制系统,可以软件控制来实现,并能够实现智能化,现在单片机控制范畴无所不在,例如通信产品、家用电器、智能仪器仪表、过程控制和专用控制装置等等,单片机的应用领域越来越广泛。诚然

计算机组成与设计(十)—— 流水线的冒险

混江龙づ霸主 提交于 2020-04-03 04:35:15
冒险 流水线技术之所以能提高性能 究其本质是利用了时间上的并行性, 那它让原本应该先后执行的指令 在时间上一定程度的并行起来,然而这也会带来一些冲突和矛盾, 进而可能引发错误。 冒险( Hazard ) :在流水线中我们希望当前每个时钟周期都有一条指令进入流水线可以执行。但 在某些情况下,下一条指令无法按照预期开始执行,这种情况就被称为冒险 。 冒险分为三种: 结构冒险:如果一条指令需要的硬件部件还在为之前的指令工作,而无法为这条指令提供服务,那就导致了结构冒险。(这里结构是指硬件当中的某个部件) 数据冒险:如果一条指令需要某数据而该数据正在被之前的指令操作,那这条指令就无法执行,就导致了数据冒险 控制冒险:如果现在要执行哪条指令,是由之前指令的运行结果决定,而现在那条之前指令的结果还没产生,就导致了控制冒险。 结构冒险 示例一:如果指令和数据放在同一个存储器中,则不能同时读存储器 解决方案一:我们有一个方便又简便的方法,即流水线停顿( stall ),产生空泡( bubble )。 虽然流水线停顿能用来解决各种冒险,但它的效率低下,应尽量避免。 解决方案二:在存储器中设置单独的指令高速缓存和数据高速缓存。(要强调的在计算机中主存储器也就是内存是统一存放指令和数据的, 这也是冯诺依曼结构的要求,只是在CPU当中 的一级高速缓存会采用指令和数据分别存放的方式) 示例二

PLC:学习笔记(西门子)2

戏子无情 提交于 2020-03-28 13:26:26
传统的工业控制系统:继电器-接触器 PLC(programmable logic controller) PLC特点: 1、plc可靠性高(软件代替复杂线路、抗干扰的CPU、电源采用多级滤波并用集成稳压块稳压、IO采用光电隔离技术) 2、丰富IO口(交流、直流、开关量、模拟量、电压、电流、脉冲、电位、强电、弱电都有相应的IO模块和工业现场的设备) 3、模块化结构(plc辅助触点不受次数的限制,只需考虑输入、输出点个数即可) 4、编程简单(梯形图)、安装简单、设计施工周期短 PLC工作方式:采用循环扫描的工作方式其输入/输出存在响应滞后 PLC基本组成:中央处理单元(大型的多采用冗余系统或三CPU表决式系统)、存储器、输入/输出接口(现场常用输入接口:按钮开关、行程开关、接触器的触点、传感器输出的开关量或模拟量(DAC后输入进plc)输入一般接光电耦合电路和微电脑输入接口电路(输入数据寄存器、选通电路、中断请求电路) 现场常用输出:电磁阀、接触器、继电器、信号灯、电动机等 其电路组成和输入相近:输出接口电路和功率驱动电路(继电器方式输出、晶闸管方式输出、晶体管方式输出)) 4、电源 5、底板和机架 6、PLC的外部设备(编程设备(RS232、RS422)、监控设备、存储设备、输入/输出设备) 7、PLC的通信网络(各厂家均在向标准通信协议靠拢) PLC编程语言:因为厂家和机型不同

进入保护模式

与世无争的帅哥 提交于 2020-03-26 15:04:05
全局描述符   和一个段有关的信息需要 8 个字节来描述,所以称为 段描述符(Segment Descriptor) ,每个段都需要一个描述符。为了存放这些描述符,需要在内存中开辟出一段空间。在这段空间里,所有的描述符都是挨在一起,集中存放的,这就构成一个 描述符表 ,最主要的描述符表是 全局描述符表(Global Descriptor Table,GDT) 。   为了跟踪全局描述符表,处理器内部有一个 48 位的寄存器,称为 全局描述符表寄存器(GDTR) 。该寄存器分为两部分,分别是 32 位的线性地址和 16 位的边界。32 位的处理器具有 32 根地址线,可以访问的地址范围是 0x00000000 到0xFFFFFFFF,共 232字节的内存,即 4GB 内存。所以,GDTR的 32 位线性基地址部分保存的是全局描述符表在内存中的起始线性地址,16 位边界部分保存的是全局描述符表的边界(界限),其在数值上等于表的大小(总字节数)减一。   因为 GDT 的界限是 16 位的,所以,该表最大是 2 16 字节,也就是 65536 字节(64KB)。又因为一个描述符占 8 字节,故最多可以定义 8192 个描述符。   由于在实模式下只能访问 1MB 的内存,故 GDT 通常都定义在 1MB 以下的内存范围中。当然,允许在进入保护模式之后换个位置重新定义 GDT。

20145205 《信息安全系统设计基础》第5周学习总结

喜你入骨 提交于 2020-03-23 03:17:00
教材学习内容总结 程序编码 GCC将源代码转化为可执行代码的步骤: C预处理器——扩展源代码-生成.i文件 编译器——产生两个源代码的汇编代码-——生成.s文件 汇编器——将汇编代码转化成二进制目标代码——生成.o文件 链接器——产生可执行代码文件 机器级代码 1.机器级编程的两种抽象 (1)指令集结构ISA 是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。 (2)机器级程序使用的存储器地址是虚拟地址 看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。 2.几个处理器: 程序计数器(CS:IP) 整数寄存器(AX,BX,CX,DX) 条件码寄存器(OF,SF,ZF,AF,PF,CF) 浮点寄存器 一条机器指令只执行一个非常基本的操作。 程序编码 书上107页的代码,需要用到反汇编器。在Linux系统中,带‘d’命令行标志的程序OBJDUMP可以充当这个角色。 数据格式 数据传送指令的三个变种: movb 传送字节 movw 传送字 movl 传送双字 访问信息 一个IA32中央处理单元(CPU)包含8个存储32位置的寄存器 操作数指示符 立即数 寄存器 存储器 寻址方式 (1)立即数寻址方式 格式:$后加用标准c表示法表示的整数,如 $0xAFF (2)寄存器寻址方式 如%eax,与汇编中学过的AX寄存器类比。 (3

CPU体系结构(组成部分)

﹥>﹥吖頭↗ 提交于 2020-03-16 00:27:10
在准备网络工程师考试,里面有些知识点是比较常考的。自己写这篇博客呢,当作是笔记吧,自己看一看也分享给大家一起学习。 这部分的内容就是讲CPU里面的组成结构以及各部分的功能。 CPU的构成:CPU主要由 运算器 、 控制器 、 寄存器组 和 内部总线 构成。 运算器 :由 算术逻辑单元ALU 、 通用寄存器 、 数据暂存器 等组成。程序状态字寄存器接受从控制器送来的命令并执行相应的动作,主要负责对数据的加工和处理。 算术逻辑单元ALU:用于进行各种算术逻辑运算(如与、或、非等)、算术运算(如加减乘除等) 通用寄存器:用来存放操作数、中间结果和各种地址信息的一系列存储单元。常见的通用寄存器如下:     a) 数据寄存器:        AX,累加寄存器,算数运算的主要寄存器;        BX,基址寄存器;        CX,计数寄存器,串操作、循环控制的计数器;        DX,数据寄存器。     b) 地址指针寄存器:       SI:源变址寄存器;       DI:目的变址寄存器;       SP:堆栈寄存器;       BP:基址指针寄存器     c) 累加寄存器:AC,又称为累加寄存器。当运算器的逻辑单元执行算术运算或者逻辑运算的时候,为ALU提供一个工作区。   3.数据暂存器:用来暂存从主存储器读出的数据,这个数据不能存放在通用寄存器中

Windows Internals 笔记——线程调度

孤街浪徒 提交于 2020-03-12 03:25:22
1.线程内核对象中的CONTEXT反应了线程上一次执行时CPU寄存器的状态。大约每隔20ms,Windows都会查看所有当前存在的线程内核对象。Windows在可调度的线程内核对象中选择一个,并将上次保存在线程上下文中的值载入CPU寄存器。这一操作被称为上下文切换。Windows实际上会记录每个线程的运行次数。 2.调用CreateProcess或者CreateThread时,系统将创建线程内核对象,并把挂起计数初始化为1。这样就不会给这个线程调度CPU了,因为线程初始化需要时间,我们不想再线程准备好之前就开始执行它。在线程初始化之后,CreateProcess或者CreateThread函数将查看是否有CREATE_SUSPENDED标志传入,如果有,函数返回并让新的线程处于挂起状态。如果没有,函数会将线程的挂起计数递减为0,线程就成为可调度的了。 3.通过创建一个处于挂起状态的线程,我们可以在线程执行任何代码之前改变它的环境(比如优先级)。之后可以调用ResumeThread函数使其变为可调度的,如果调用成功会返回线程的前一个挂起计数,否则返回0xFFFFFFFF。 4.还可以调用SuspendThread来挂起线程,任何线程都可以调用这个函数挂起另外一个线程(只要有线程句柄)。显然线程可以将自己挂起,但是它无法自己恢复。SuspendThread返回线程之前的挂起计数