指令寄存器

计算机系统之一计算机系统漫游

ぐ巨炮叔叔 提交于 2020-01-24 14:47:40
作为一个程序员,如果深入了解这些组件是如何工作的,以及这些组件是如何影响程序的正确性和性能的,以此来提高自己的技能,可以推荐<深入理解计算机系统>这本书,本系列也是作者在参读了这本书后的一些个人理解和对概念的认识,也可以当做我的个人笔记,希望对你有所帮助 代码无国界 计算机系统是由硬件和软件组成的 ,他们共同工作来运行应用程序.虽然系统的具体实现方式随着时间的变化而变化,但是系统内在的概念却没有改变.所有的计算机系统否有类似的硬件和软件组件,而且都执行这相似的功能. 1 #include <stdio.h> 2 int main () { 3 printf("hello world"); 4 } 这是一段c语言的源程序(源文件),在这里命名为hello.c 源程序实际上就是由值0和1组成的位(bit)序列,8个位被组织成一组,成为字节. 而每个字节表示程序中某个文本字符 大部分的现代系统都使用 ASCII 标准来表示文本字符,这中方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符, 作为一个Java程序员每天接触最多的就是UTF-8 ,一开始也会迷糊,为了更好的理解他们之间的关系,推荐几篇博客: ASCII、Unicode、GBK和UTF-8字符编码的区别联系 ASCII,Unicode和UTF-8 hello.c程序以字节的方式存储在文件中.每个字节都有一个整数值

x86对抗栈回溯检测

社会主义新天地 提交于 2020-01-24 05:40:27
1.原理 函数调用 CALL 指令可拆分为两步操作: 1)、 将调用者的下一条指令( EIP )的地址压栈 2)、 跳转至将要调用的函数地址中(相对偏移或绝对地址) 那么在执行到子函数首地址位置时,返回地址(即调用函数中调用位置下一条指令的地址)就已经存在于堆栈中了,并且是 ESP 指向地址的值。下面通过栈帧的概念,了解编译器在接下来对堆栈进行的操作。 简言之,栈帧就是利用 EBP (栈帧指针,请注意不是 ESP )寄存器访问栈内部局部变量、参数、函数返回地址等的手段。程序运行中, ESP 寄存器的值随时变化,访问栈中函数的局部变量、参数时,若以 ESP 值为基准编写程序会十分困难,并且也很难使 CPU 引用到正确的地址。 所以,调用某函数时,先要把用作基准点(函数起始地址)的 ESP 值保存到 EBP ,并维持在函数内部。这样,无论 ESP 的值如何变化,以 EBP 的值为基准能够安全访问到相关函数的局部变量、参数、返回地址,这就是 EBP 寄存器作为栈帧指针的作用。 在函数体代码的任何位置,EBP 寄存器指向的地址始终存储属于它的调用函数的 EBP 的值,根据这个原理可逐级向调用函数、调用函数的调用函数进行遍历,向上回溯。 这样有什么用呢? 在将属于调用函数的 EBP 的值压栈之前, ESP 指向的地址存储的是由 CALL 指令压栈的调用函数中调用位置的下一条指令的地址(原

十一、S3C2440 裸机 — GPIO

跟風遠走 提交于 2020-01-24 05:37:22
11.1 GPIO 介绍 11.1.1 GPIO 管脚 GPIO 即是输入输出端口,S3C2440A 包含了 130 个多功能输入/输出口引脚并且它们为如下显示的八个端口: 端口 A(GPA):25 位输出端口 端口 B(GPB):11 位输入/输出端口 端口 C(GPC):16 位输入/输出端口 端口 D(GPD):16 位输入/输出端口 端口 E(GPE):16 位输入/输出端口 端口 F(GPF):8 位输入/输出端口 端口 G(GPG):16 位输入/输出端口 端口 H(GPH):9 位输入/输出端口 端口 J(GPJ):13 位输入/输出端口 GPIO 的功能即是用于 CPU 采集外设信号(INPUT),CPU 输出控制信号(OUTPUT),还有一种功能称为管脚复用功能,即是 GPIO 用于其他信号功能,比如地址,串口等共呢个,GPIO 属于 SOC 的内部外设。 GPIO 的使用需要寄存器配置。 11.1.2 GPIO 寄存器 端口配置寄存器:GPACON --- GPJCON,即配置输入或是输出,还是配置为第三功能 端口数据寄存器:GPADAT---GPJDAT,用于数据的写入或读取 端口上拉寄存器:GPBUP---GPJUP,端口上拉寄存器控制每个端口组的使能/禁止上拉电阻。 当相应位为 0 时使能引脚的上拉电阻。当为 1 时禁止上拉电阻。 如果使能了上拉电阻

FreeRTOS 中断优先级配置(重要)

為{幸葍}努か 提交于 2020-01-24 03:01:52
以下转载自安富莱电子: http://forum.armfly.com/forum.php NVIC 的全称是 Nested vectored interrupt controller,即嵌套向量中断控制器。 对于 M3 和 M4 内核的 MCU,每个中断的优先级都是用寄存器中的 8 位来设置的。 8 位的话就可以 设置 2^8 = 256 级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如 ST 的 STM32F1xx 和 F4xx 只使用了这个 8 位中的高四位[7:4],低四位取零,这样 2^4=16,只能表示 16 级中断嵌套。 对于这个 NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级,下面就以 STM32 为 例进行介绍,STM32F1xx 和 F4xx 都是只使用了这个 8 位寄存器的高四位[7:4]。 从上面的表格可以看出,STM32 支持 5 种优先级分组,系统上电复位后,默认使用的是优先级分组 0,也就是没有抢占式优先级,只有子优先级,关于这个抢占优先级和这个子优先级有几点一定要说清楚。  具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中 断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。  在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来

Linux源码学习三、vmlinux.lds.S、MRC/MCR协处理器寄存器指令和head.S文件分析

微笑、不失礼 提交于 2020-01-24 02:59:01
①vmlinux.lds.S文件在目录arch/arm/kernel/vmlinux.lds.S下 分析VMLINUX_SYMBOL(__proc_info_begin) = .; vmlinux.lds.S文件 的内容为: #include <asm-generic/vmlinux.lds.h> #include <asm/thread_info.h> #include <asm/memory.h> #include <asm/page.h> 分别表示include文件夹里的<>目录下的内容。 #define PROC_INFO \ VMLINUX_SYMBOL(__proc_info_begin) = .; \ *(.proc.info.init) \ VMLINUX_SYMBOL(__proc_info_end) = .; \表示连接符,一个句子太长分开连接的意思,相当于: 相当于 PROC_INFO 代表后面一长串,包含后面的分号。 VMLINUX_SYMBOL(__proc_info_begin) = .; 因为 vmlinux.lds.S文件 引入: #include <asm-generic/vmlinux.lds.h> ,在 目录include/asm-generic/vmlinux.lds.h头 文件中有部分内容为: #ifndef SYMBOL_PREFIX

计算机组成原理学习1笔记1

别等时光非礼了梦想. 提交于 2020-01-22 23:52:36
计算机系统简介 硬件体系 讲授内容:计算机、组织(组成:计算机硬件系统的逻辑实现 ——数字电路、数字逻辑)、原理(不依托机器) 基本内容 基本部件的结构与组织方式 基本运算的操作原理 基本部件与基本单元的设计思想,如何将部件连接起来 特色 计算机组成的一般原理,不易具体机型为依托 采用自顶而下的方式、层层细化 教材:唐硕飞 - 计算机组成原理(第二版),学习指导与习题解答 参考教材: Patterson\Hennessy- 计算机组成与设计:硬 / 软件接口;数字设计和计算机体系结构(共有两部分,实现处理器) 计算机组成原理是连接软硬件的中间层 课程组织 1、概论 2、 计算机系统硬件结构 存储器、 IO 、 CPU 、系统总线 3、CPU ( ALU 、 CU 、寄存器) 4、CU (排队逻辑、寄存器解码器、控制存储器) 第一章 计算机系统概论 物联网:将传感器嵌入到各设备之中,并且被普遍连接,即 “物联网”, + “互联网” = 人类社会与物理系统的整合。 超算:HPC(higher performance computer) TF(千万亿次) 1.1计算机软硬件概念     计算机系统:硬件(实体)、软件(具有各类特殊功能的信息组成)   层次结构——软件:系统软件(管理整个计算机系统;语言处理程序,操作系统,服务性程序(数学库),数据库管理系统)、应用软件

主存管理

送分小仙女□ 提交于 2020-01-22 08:38:51
1 概念 存储器 storage, memmory 能接收数据和保存数据、而且能根据命令提供这些数据的装置。 存储器分成两类: 内存储器(简称内存、主存、物理存储器) 处理机能直接访问的存储器。用来存放系统和用户的程序和数据,其特点是存取速度快,存储方式是以新换旧,断电信息丢失。 外存储器(简称外存、辅助存储器) 处理机不能直接访问的存储器。用来存放用户的各种信息,存取速度相对内存而言要慢得多,但它可用来长期保存用户信息。在文件系统中介绍。 1.内存的物理组织 物理地址: 把内存分成若干个大小相等的存储单元,每个单元给一个编号,这个编号称为内存地址(物理地址、绝对地址、实地址),存储单元占8位,称作字节(byte)。 物理地址空间: 物理地址的集合称为物理地址空间(主存地址空间),它是一个一维的线性空间。 2.程序的逻辑结构 程序地址:用户编程序时所用的地址(或称逻辑地址 、虚地址 ),基本单位可与内存的基本单位相同,也可以不相同。 程序地址空间(逻辑地址空间、虚地址空间):用户的程序地址的集合称为逻辑地址空间,它的编址总是从0开始的,可以是一维线性空间,也可以是多维空间。 2存储管理的功能 1.存储管理功能 地址映射 将程序地址空间中使用的逻辑地址变换成主存中的地址的过程 (2) 主存分配 按照一定的算法把某一空闲的主存区分配给作业或进程。 (3) 存储保护 保证用户程序

ARMV8体系结构简介:AArch64系统级体系结构之编程模型(2)- 寄存器

元气小坏坏 提交于 2020-01-21 14:11:15
1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加、异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AARCH64 state和AARCH32 state 2.1 AARCH64下指令运行与异常处理寄存器 寄存器类型 Bit 描述 X0-X30 64bit 通用寄存器,如果有需要可以当做32bit使用:W0-W30 V0-V31 128bit 32个浮点寄存器,用于标量的浮点操作和向量或标量的SIMD操作 XZR 64bit Zero寄存器,写入此寄存器的数据被忽略,读出的数据全为0 WZR 32bit Zero寄存器的32bit形式 LR (X30) 64bit 通常称X30为程序链接寄存器,保存跳转返回信息地址 ELR_ELx 64bit 异常链接寄存器,保存异常进入ELx的异常地址(x={1,2,3}) SP_ELx 64bit 每个异常级别都有一个专用的SP寄存器,若PSTATE.M[0] ==1,则每个ELx选择SP_ELx(x={0,1,2,3}),否则选择同一个SP_EL0 PC 64bit 程序计数器,俗称PC指针,总是指向即将要执行的下一条指令 SPSR_ELx 32bit 保存进入ELx的PSTATE状态信息(x={1,2,3}) NZCV [31:28]:

程序执行的过程 - 一文看懂计算机执行程序的过程

旧街凉风 提交于 2020-01-20 13:15:53
程序就是指令的集合,为使计算机按预定要求工作,首先要编制程序。程序是一个特定的指令序列,它告诉计算机要做哪些事,按什么步骤去做。指令是一组二进制信息的代码,用来表示计算机所能完成的基本操作。   1、程序   程序是为求解某个特定问题而设计的指令序列。程序中的每条指令规定机器完成一组基本操作。如果把计算机完成一次任务的过程比作乐队的一次演奏,那么控制器就好比是一位指挥,计算机的其它功能部件就好比是各种乐器与演员,而程序就好像是乐谱。计算机的工作过程就是执行程序的过程,或者说,控制器是根据程序的规定对计算机实施控制的。例如,对于算式      计算机的解题步骤可作如下安排:   步骤1:取a ;   步骤2:取b ;   步骤3:判断 ;   若 b≥0,执行步骤4   若b<0,执行步骤6   步骤4:执行a+b;   步骤5:转步骤7;   步骤6:执行a-b;   步骤7:结束。   计算机的工作过程可归结为:取指令→分析指令→执行指令→再取下一条指令,直到程序结束的反复循环过程。通常把其中的一次循环称为计算机的一个指令周期。总之,我们可把程序对计算机的控制归结为每个指令周期中指令对计算机的控制。   2、指令   程序是由指令组成的。指令是机器所能识别的一组编制成特定格式的代码串,它要求机器在一个规定的时间段(指令周期)内,完成一组特定的操作

C/C++中volatile关键字详解

拥有回忆 提交于 2020-01-17 05:18:36
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier 。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明: A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided. volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法: int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。例如: 1 volatile int i=10; 2 int a = i; 3 ... 4 // 其他代码,并未明确告诉编译器,对 i